我可以在 kotlin 中使用 java lambda 表达式吗?
Can I use java lambda expression in kotlin?
我来自java,我习惯了java lambdas,现在我在一个kotlin项目中工作,我看到还有其他类型的lambdas,因为我更喜欢java 语法(我还读到它们的性能更好)
Can I still use java lambdas in kotlin?
我尝试这样做,但无法编译:
从句法上讲,不是。在 Kotlin 中,您只能以 Kotlin 方式编写 lambda,即
{ p1, p2, p3 -> ... }
但这并不意味着您不能将 Kotlin lambda 传递给 Java API 接受功能接口。这完全有可能。
毕竟,Kotlin 和 Java 是两种不同的语言,具有不同的语法。
// Stream.map is a Java API, but it can take a "Kotlin lambda" just fine
ids.stream().map { anId -> anId + 1 }
但是,既然你提到 Java lambdas“性能更好”(假设你的意思是它们被编译为 invokedynamic
调用),应该注意 Kotlin lambdas 也这样做自 Kotlin 1.5 起,在某些情况下,如所讨论的 here:
Kotlin 1.5.0 now uses dynamic invocations (invokedynamic
) for
compiling SAM (Single Abstract Method) conversions:
- Over any expression if the SAM type is a Java interface
- Over lambda if the SAM type is a Kotlin functional interface
所以上面的 Stream.map
调用将使用 invokedynamic
编译,就像 Java lambda 一样,因为它是到 Java 接口的转换 java.util.function.Function
。另一方面,常规的 Kotlin lambda 将被编译为匿名内部 class.
我来自java,我习惯了java lambdas,现在我在一个kotlin项目中工作,我看到还有其他类型的lambdas,因为我更喜欢java 语法(我还读到它们的性能更好)
Can I still use java lambdas in kotlin?
我尝试这样做,但无法编译:
从句法上讲,不是。在 Kotlin 中,您只能以 Kotlin 方式编写 lambda,即
{ p1, p2, p3 -> ... }
但这并不意味着您不能将 Kotlin lambda 传递给 Java API 接受功能接口。这完全有可能。
毕竟,Kotlin 和 Java 是两种不同的语言,具有不同的语法。
// Stream.map is a Java API, but it can take a "Kotlin lambda" just fine
ids.stream().map { anId -> anId + 1 }
但是,既然你提到 Java lambdas“性能更好”(假设你的意思是它们被编译为 invokedynamic
调用),应该注意 Kotlin lambdas 也这样做自 Kotlin 1.5 起,在某些情况下,如所讨论的 here:
Kotlin 1.5.0 now uses dynamic invocations (
invokedynamic
) for compiling SAM (Single Abstract Method) conversions:
- Over any expression if the SAM type is a Java interface
- Over lambda if the SAM type is a Kotlin functional interface
所以上面的 Stream.map
调用将使用 invokedynamic
编译,就像 Java lambda 一样,因为它是到 Java 接口的转换 java.util.function.Function
。另一方面,常规的 Kotlin lambda 将被编译为匿名内部 class.