Kotlin是否具有身份识别功能?
Scala在Predef中有一个通用的identity
函数:
def identity[A](x: A): A
Kotlin在标准库中有类似的功能吗? 当然,我可以直接使用{ it }
,但是我发现identity
更易于阅读,并且实例化所有这些lambda表达式有点浪费。
对于任何类型的Foo
,我必须能够在函数(Foo) -> Foo
所在的地方使用这个identity
函数。 在Kotlin的类型系统中,这样的功能甚至是可能的吗? (在斯卡拉的情况下,有一个隐式的转换,将函数对象内部的方法封装起来)
目前没有这样的功能,但你可以很容易地自己定义它:
fun <T> identity(x: T): T = x
如果您认为在Kotlin标准库中有足够的用例来声明这个函数,请在youtrack.jetbrains.com上提出问题。 谢谢!
如果您需要将身份函数作为参数传递给另一个函数,则可以简单地使用{ it }
。 例如,它有一个List <List <String>,并且想要将其平铺到List <String>,则可以使用:
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())