Kotlin有身份功能吗?

时间:2015-09-01 16:17:49

标签: kotlin

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

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

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

对于任何类型identity,我必须能够在需要函数(Foo) -> Foo的地方使用此Foo函数。在Kotlin的类型系统中,这样的功能是否可行? (在Scala的情况下,有一个隐式转换,它将方法包装在一个函数对象中。)

2 个答案:

答案 0 :(得分:13)

目前还没有这样的功能,但您可以自己轻松定义:

fun <T> identity(x: T): T = x

如果您认为在Kotlin标准库中声明此功能有足够的用例,请在youtrack.jetbrains.com提交问题。谢谢!

答案 1 :(得分:8)

如果您需要将身份函数作为参数传递给另一个函数,您只需使用{ it }即可。例如,您有一个List&lt; List&lt; String&gt;&gt;并希望将其展平为List&lt; String&gt;,您可以使用:

list.flatMap(identity)

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

list.flatMap { it }

这相当于:

list.flatMap { x -> x }

另一种方法是在某处定义身份功能,例如:

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

但我们无法创建通用val,因此我们必须为每种类型定义一个标识函数。解决方案(在Java Function接口中完成)是将其定义为常量函数:

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

并将其用作:

list.flatMap(identity)

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

list.flatMap { it }

无法为所有人声明一次身份功能(适用于所有类型),因为必须对其进行参数化。可能的是使用返回此身份函数的函数:

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

虽然它完成了这项工作,但由于现在要编写:

,因此它不是很有帮助
list.flatMap(identity())