Имеет ли Котлин функцию идентификации?

Scala имеет общую функцию identity в Predef:

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

Есть ли у Kotlin аналогичный объект в стандартной библиотеке? Конечно, я мог бы просто использовать { it } вместо этого, но я считаю, что identity легче читать, а создание экземпляров всех этих лямбдов немного расточительно.

Я должен иметь возможность использовать эту функцию identity в местах, где ожидается функция (Foo) -> Foo для любого типа Foo . Возможна ли такая функция в системе типов Котлина? (В случае Scala существует неявное преобразование, которое обертывает метод внутри объекта функции или что-то еще.)

На данный момент такой функции нет, но вы можете легко определить ее самостоятельно:

 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())