[英]Kotlin - Functional (SAM) interfaces VS Function types
在 Kotlin 1.4 中,我们现在有了函数式接口
fun interface Todo {
fun run()
}
fun runBlock(todo: Todo){
if(condition)
todo.run()
}
fun runBlock{
println("Hello world")
}
在我总是使用 (T) -> T 之前
inline fun runBlock(block: ()-> Unit){
if(condition)
block()
}
fun runBlock{
println("Hello world")
}
所以基本上我可以使用这两种方法完成相同的任务,通过使用 Functional SAM() Interfaces over Function Type 有任何性能优势吗?。
https://kotlinlang.org/docs/reference/whatsnew14.html#sam-conversions-for-kotlin-interfaces
编译器会自动将 lambda 转换为实现抽象成员函数的类的实例。
所以,没有性能优势,和以前一样。 编译器现在做你以前必须做的事情。
这是一个性能DIS -advantage因为拉姆达不再内联(除非JIT决定,但它不会是瞬间)。 即使您将runBlock
标记为inline
,编译器也会警告您该参数不会被内联。
使用 fun 接口而不是函数类型的原因只有两个:
扩展第 1 点:在 Kotlin 1.4 之前,建议将函数式接口保留为 Java 代码,即使所有其他代码都是 Kotlin。 通过这种方式,您可以在 Java 和 Kotlin 代码中对这些类型的参数使用 lambda。 但是如果你在 Kotlin 中声明了接口,你就只能在 Java 中为它们使用 lambdas。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.