在 Kotlin 中使用 Lambda 表达式实现函数接口

Implementing Function Interface using Lambda Expression in Kotlin

@FunctionalInterface
interface Interf {
    fun m1(num: Int)
}

fun main() {
    val a: Interf = { 34 -> println("Hello world !!") }
}

编译时出现此错误

Unexpected tokens (use ';' to separate expressions on the same line)

Kotlin lambda 函数语法与 Java Lambda 表达式有点不同吗?

首先,这也不会在 java 中编译:

@FunctionalInterface
interface Interf {
    void m1(int num);
}

class Main {
    public static void main(String[] args) {
        Interf f =  34 -> System.out.println("Hello world !!"); //compilation error here
    }
}

同样的错误:

error: ';' expected
        Interf f =  34 -> System.out.println("Hello world !!");
                      ^

要使其正确,应更改 lambda 参数的名称,使其成为有效的 java identifier.

例如,这将编译:

Interf f =  x -> System.out.println("Hello world !!");

现在,回到 Kotlin。 1.4 版引入了 SAM conversions:

的语法
fun interface Interf {
    fun m1(num: Int)
}

它可以被实例化为:

val a = Interf { println("Hello world !!") }

这里保留了 implicitly declared it parameter 仅引用 lambda 参数的约定。