Имеет ли Котлин функцию идентификации?
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())