Java 中的 Lambda 语法
至于什么时候可以在 Java 中使用 Lambda ,具体可以参见 是时候了解 Lambda 表达式具体写法了
代码示例
public static void main(String[] args) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Lambda");
}
});
thread.start();
}
在 Java 8 开始支持 Lambda 表达式,以上代码可以使用如下方式表示:
Thread thread = new Thread(() -> {
System.out.println("Lambda");
});
如果方法体中只有一行代码,即run() 方法
中只有一行代码,那么有更加简便的写法(省略了"{}"
):
Thread thread = new Thread(() -> System.out.println("Lambda"));
Kotlin 的 Lambda 语法
val thread = Thread({ -> println("kotlin") })
thread.start()
很明显 Kotlin 中 Lambda 语法与 Java 中 Lambda 的不同点:
Java 中的"->"
符号在花括号 "{}"
的外边,而 Kotlin 在里面。
同时,Kotlin 中可以多余的冗余信息:
- 当无任何参数时,可以省略箭头符号"->":
val thread = Thread({println("kotlin") })
thread.start()
- 如果 Lambda 是函数的最后一个参数,可以将大括号放在小括号的外边:
val thread3 = Thread(){ println("kotlin")}
- 如果函数只有一个参数,且这个参数是 Lambda,则可以省略小括号:
val thread3 = Thread{ println("kotlin")}
Kotlin 中 Lambda 闭包
闭包声明
val echo = { name: String ->
println(name)
}
闭包声明
fun main(args: Array<String>){
echo.invoke("Kotlin")
echo(kotlin)
}
Lambda 在编译后会被编译成匿名内部对象:
public final class TestKt {
@NotNull
private static final Function1 echo;
@NotNull
public static final Function1 getEcho() {
return echo;
}
public static final void main(@NotNull String[] args) {
Intrinsics.checkParameterIsNotNull(args, "args");
echo.invoke("kotlin");
echo.invoke("kotlind");
}
static {
echo = (Function1)null.INSTANCE;
}
}
Kotlin Lambda 参数是有上限,为 22 ,可以自定义 Java 接口扩展参数个数。