Kotlin有身份功能吗?

fre*_*low 17 kotlin

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

def identity[A](x: A): A
Run Code Online (Sandbox Code Playgroud)

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

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

Ale*_*lov 14

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

fun <T> identity(x: T): T = x
Run Code Online (Sandbox Code Playgroud)

如果您认为有足够的用例可以在Kotlin标准库中声明此函数,请在youtrack.jetbrains.com上提交一个问题.谢谢!

  • 您需要编写 `::identity` 以便从函数实例化函数对象。这类似于 Java 的方法引用。 (2认同)

Pie*_*ont 10

如果您需要将身份函数作为参数传递给另一个函数,您可以简单地使用{ it }.例如,你有一个List <List <String >>并希望将它展平为List <String>,你可以使用:

list.flatMap(identity)
Run Code Online (Sandbox Code Playgroud)

identity身份功能在哪里.这可以写成:

list.flatMap { it }
Run Code Online (Sandbox Code Playgroud)

这相当于:

list.flatMap { x -> x }
Run Code Online (Sandbox Code Playgroud)

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

val identity: (List<String>) -> List<String> = { it }
Run Code Online (Sandbox Code Playgroud)

但是我们不能创建泛型val,所以我们必须为每种类型定义一个标识函数.解决方案(在Java Function界面中完成)是将其定义为常量函数:

fun <A> identity(): (A) -> A = { it }
Run Code Online (Sandbox Code Playgroud)

并将其用作:

list.flatMap(identity)
Run Code Online (Sandbox Code Playgroud)

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

list.flatMap { it }
Run Code Online (Sandbox Code Playgroud)

一次为所有人声明一个身份函数(适用于所有类型)是不可能的,因为它必须进行参数化.可能的是使用返回此标识函数的函数:

fun <T> identity(): (T) -> T  = { it }
Run Code Online (Sandbox Code Playgroud)

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

list.flatMap(identity())
Run Code Online (Sandbox Code Playgroud)

  • 是的,更容易编写,但是在某些用例中,定义一个识别函数非常有用(例如具有可选过滤器阶段的通用流操作序列)。 (2认同)
  • 然而,事实上,我认为你可以通过使用扩展函数来伪造泛型: `fun &lt;T: Any&gt; T.identity(): T = this` 然后调用它,你可以使用`任何::身份` (2认同)