繁体   English   中英

Kotlin - 函数 (SAM) 接口 VS 函数类型

[英]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. 使用 Java 功能接口移植代码时的向后兼容性。
  2. 未在 API 中公开供 Java 使用的 Kotlin 函数类型。

扩展第 1 点:在 Kotlin 1.4 之前,建议将函数式接口保留为 Java 代码,即使所有其他代码都是 Kotlin。 通过这种方式,您可以在 Java 和 Kotlin 代码中对这些类型的参数使用 lambda。 但是如果你在 Kotlin 中声明了接口,你就只能在 Java 中为它们使用 lambdas。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM