kotlin - Kotlin 有恒等函数吗?

标签 kotlin

Scala 在 Predef 中有一个通用的 identity 函数:

def identity[A](x: A): A

Kotlin 在标准库中有类似的功能吗?当然我可以简单地使用 { it } 代替,但我发现 identity 更容易阅读,并且实例化所有这些 lambdas 有点浪费。

对于任何类型 Foo,我必须能够在需要函数 (Foo) -> Foo 的地方使用此 identity 函数>。在 Kotlin 的类型系统中甚至可以实现这样的功能吗? (在 Scala 的情况下,有一个隐式转换,将方法包装在函数对象或其他东西中。)

最佳答案

如果您需要将标识函数作为参数传递给另一个函数,您可以简单地使用 { it }。例如,如果你有一个 List> 并且想要将它展平为一个 List,你可以使用:

list.flatMap(identity)

其中 identity 是标识函数。这可以写成:

list.flatMap { it }

这相当于:

list.flatMap { x -> x }

另一种方法是在某处定义恒等函数,例如:

val identity: (List<String>) -> List<String> = { it }

但是我们不能创建一个通用的val,所以我们必须为每种类型定义一个恒等函数。解决方案(就像在 Java Function 接口(interface)中所做的那样)是将其定义为常量函数:

fun <A> identity(): (A) -> A = { it }

并将其用作:

list.flatMap(identity)

当然,写起来要容易得多:

list.flatMap { it }

不可能一次性声明一个恒等函数(这将适用于所有类型),因为它必须被参数化。可以使用返回此标识函数的函数:

fun <T> identity(): (T) -> T  = { it }

虽然它完成了这项工作,但它并不是很有帮助,因为现在必须编写:

list.flatMap(identity())

关于kotlin - Kotlin 有恒等函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32336436/

相关文章:

android - 我可以使用一个工厂将 View 模型/存储库调用与 kodein 绑定(bind)吗

android - Android Services 与 MVVM 中的 Activity 通信(Model View View Model)

android - 禁用 kapt 的增量构建

kotlin - 为什么赋值不是语句

java - 如何交叉引用参数中的类型

kotlin - 必须在使用前声明 Kotlin 本地函数

android - 删除在闭包内创建的实时数据 Observer

gradle - 如何使用 Gradle Kotlin-DSL 添加本地资源

android - 如何在 kotlin android 中共享 .txt 文件

java - Dagger /缺失绑定(bind)。如果没有 @Provides 注释的方法,则无法提供输出器