科特林:lambda从不编译
我刚刚开始学习Kotlin,我在那里遇到了lambdas语法的问题。有一个小示例类:科特林:lambda从不编译,lambda,kotlin,Lambda,Kotlin,我刚刚开始学习Kotlin,我在那里遇到了lambdas语法的问题。有一个小示例类: class MathFunctions { @FunctionalInterface interface Operation { fun calculate(a: Int, b: Int): Int } fun makeCalculations(a: Int, b: Int, operation: Operation): Int = operation.calc
class MathFunctions {
@FunctionalInterface
interface Operation {
fun calculate(a: Int, b: Int): Int
}
fun makeCalculations(a: Int, b: Int, operation: Operation): Int = operation.calculate(a, b)
companion object {
@JvmStatic
fun main(args: Array<String>) {
val plus = Operation { a, b -> a + b }
val mathFunctions = MathFunctions()
println(mathFunctions.makeCalculations(10, 20, plus))
}
}
}
应该纠正什么?我已经在Intellij Idea中尝试了从Java到Kotlin的自动转换,但失败了。如果您严格地想将Java代码转换为Kotlin,答案是:
fun main(args: Array<String>) {
val plus = object : MathFunctions.Operation {
override fun calculate(a: Int, b: Int) = a + b
}
val mathFunctions = MathFunctions()
println(mathFunctions.makeCalculations(10, 20, plus))
}
class MathFunctions {
@FunctionalInterface
interface Operation {
fun calculate(a: Int, b: Int): Int
}
fun makeCalculations(a: Int, b: Int, operation: Operation): Int = operation.calculate(a, b)
}
fun main(args:Array){
val plus=object:MathFunctions.Operation{
覆盖乐趣计算(a:Int,b:Int)=a+b
}
val mathFunctions=mathFunctions()
println(mathFunctions.makeCalculations(10、20及以上))
}
类数学函数{
@功能接口
接口操作{
有趣的计算(a:Int,b:Int):Int
}
计算(a:Int,b:Int,operation:operation):Int=operation.calculate(a,b)
}
但是,如果您有选择的话,您可能更喜欢以下方式,将操作保留为lambda参数,而不是作为接口bat:
fun main(args: Array<String>) {
val mathFunctions = MathFunctions()
println(mathFunctions.makeCalculations(10, 20, { a, b -> a + b}))
}
class MathFunctions {
fun makeCalculations(a: Int, b: Int, operation: (Int, Int) -> Int): Int = operation(a, b)
}
fun main(args:Array){
val mathFunctions=mathFunctions()
println(mathFunctions.makeCalculations(10,20,{a,b->a+b}))
}
类数学函数{
计算(a:Int,b:Int,operation:(Int,Int)->Int:Int=operation(a,b)
}
代码的问题在于Kotlin。这一限制的原因是Kotlin有,人们应该改用它们(或者退一步)
您可以将代码重写为:
class MathFunctions {
fun makeCalculations(a: Int, b: Int, operation: (Int, Int) -> Int): Int =
operation(a, b)
companion object {
@JvmStatic
fun main(args: Array<String>) {
val plus: (Int, Int) -> Int = { a, b -> a + b }
val mathFunctions = MathFunctions()
println(mathFunctions.makeCalculations(10, 20, plus))
}
}
}
Kotlin(尚未)支持Kotlin接口的SAM功能接口。它只支持Java接口的SAM。原因已在其他地方说明。但是,由于SAM范式在Java中无处不在,而且Kotlin采用者通常会将Java转换为Kotlin,而且SAM存在于要移植的大部分代码中,因此他们可能会开始在Kotlin接口上支持SAM
答案(目前)是在希望进行lambda转换的地方使用对象文字
println(mathFunctions.makeCalculations(10, 20, object : Operation {
override fun calculate(a:Int, b:Int):Int {
return a+b
}
}))
typealias Operation = (Int, Int) -> Int
println(mathFunctions.makeCalculations(10, 20, object : Operation {
override fun calculate(a:Int, b:Int):Int {
return a+b
}
}))