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

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

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

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

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

Ответ 1

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

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

Если вы считаете, что достаточно использовать эту функцию в стандартной библиотеке Kotlin, пожалуйста, напишите на вопрос youtrack.jetbrains.com, Спасибо!

Ответ 2

Если вам нужно передать функцию идентификации как параметр в другую функцию, вы можете просто использовать { 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())