我可以在 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.