Kotlin是否具有标识功能?

Kotlin是否具有标识功能?,kotlin,Kotlin,Scala在Predef中有一个通用的identity函数: def identity[A](x: A): A Kotlin在标准图书馆有类似的设施吗?当然,我可以简单地使用{it}来代替,但是我发现identity更容易阅读,并且实例化所有这些lambda有点浪费 对于任何类型的Foo,我必须能够在需要函数(Foo)->Foo的地方使用此identity函数。这样的功能在Kotlin的类型系统中是否可能实现?(在Scala的情况下,有一个隐式转换将方法封装在函数对象或其他东西中。)目前没有这

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

def identity[A](x: A): A
Kotlin在标准图书馆有类似的设施吗?当然,我可以简单地使用
{it}
来代替,但是我发现
identity
更容易阅读,并且实例化所有这些lambda有点浪费


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

目前没有这样的函数,但您可以自己轻松定义它:

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

如果您认为有足够的用例可以在Kotlin标准库中声明此函数,请将问题提交到。谢谢

如果需要将identity函数作为参数传递给另一个函数,只需使用
{it}
。例如,如果您有一个列表,并希望将其展平为一个列表,您可以使用:

list.flatMap(identity)
其中,
identity
是标识功能。这可以写成:

list.flatMap { it }
这相当于:

list.flatMap { x -> x }
另一种方法是在某处定义标识函数,例如:

val identity: (List<String>) -> List<String> = { it }
并将其用作:

list.flatMap(identity)
当然,写起来要容易得多:

list.flatMap { it }
list.flatMap(identity())
一次性声明标识函数(适用于所有类型)是不可能的,因为它必须参数化。可以使用返回此标识函数的函数:

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

您需要编写
::identity
,以便从函数实例化函数对象。这类似于Java的方法引用!我已经找到了这样一个函数的用例!它是<代码>列表。ToMAP(A,B)<代码>函数如下:考虑有<代码>乐趣(x)=x<代码>,而不是<代码>列表。ToMAP(::IT,{长度})<代码>将列表转换为元素为键的映射。更容易编写,是的,但是有使用定义的识别函数非常有用的用例。(例如带有可选过滤级的通用流操作序列)。此函数的类型是什么?不可能使用泛型值函数,因为没有用于推断类型的信息。可以使用泛型
fun
函数返回值函数,但可能不值得。公平点。我尝试使用它的用例是提供一个标识函数来收集ion.filter(),它恰好返回布尔值。在这种情况下,我最终使用了
{true}
,但这不是一个真正的标识函数。然而,事实上,我认为您可以通过使用扩展函数来伪造泛型:
fun T.identity():T=this
然后调用它,您将使用
Any::identity
有趣的解决方案!