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上提交一个问题.谢谢!
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)