科特林:lambda从不编译

科特林: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

我刚刚开始学习Kotlin,我在那里遇到了lambdas语法的问题。有一个小示例类:

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
    }
}))