Ссылка функции Котлина

Пусть records являются потоковой / коллекционной и extract функцией, которая преобразует данные в элемент такой коллекции.

Есть ли способ в Котлине написать

 records.map {extract(it)} 

без явного применения (it) ?

Например records.map(extract) или records.map {extract}

  • Если extract – это значение (локальная переменная, свойство, параметр) функционального типа (T) -> R или T.() -> R для некоторых T и R , то вы можете передать его непосредственно на map :

     records.map(extract) 

    Пример:

     val upperCaseReverse: (String) -> String = { it.toUpperCase().reversed() } listOf("abc", "xyz").map(upperCaseReverse) // [CBA, ZYX] 
  • Если extract – это функция одного аргумента верхнего уровня или функция локального одиночного аргумента, вы можете сделать ссылку на функцию как ::extract и передать ее на map :

     records.map(::extract) 

    Пример:

     fun rotate(s: String) = s.drop(1) + s.first() listOf("abc", "xyz").map(::rotate) // [bca, yzx] 
  • Если это член или функция расширения класса SomeClass принимает никаких аргументов или свойство SomeClass , вы можете использовать его как SomeClass::extract . В этом случае records должны содержать элементы SomeType , которые будут использоваться в качестве получателя для extract .

     records.map(SomeClass::extract) 

    Пример:

     fun Int.rem2() = this % 2 listOf("abc", "defg").map(String::length).map(Int::rem2) // [1, 0] 
  • Поскольку Kotlin 1.1 , если extract является членом или функцией расширения класса SomeClass принимающего один аргумент, вы можете сделать ссылку с возможностью обращения с некоторым получателем foo :

     records.map(foo::extract) records.map(this::extract) // to call on `this` receiver 

    Пример:

     listOf("abc", "xyz").map("prefix"::plus) // [prefixabc, prefixxyz] 

(runnable demo со всеми примерами кода выше)

вы можете использовать ссылку на метод (аналогично Java).

 records.map {::extract} 

взгляните на примеры ссылок функций на kotlin docs https://kotlinlang.org/docs/reference/reflection.html#function-references

Intereting Posts
Котлин – Функции более высокого порядка и несоответствие типов Экспериментальная поддержка JUnit в Android + Kotlin не работает Использование в Generics в Multibinder Как писать while loop с ответомInputStream.read в kotlin android – – while ((i = responseInputStream.read (byteContainer)) Цель камеры не работает: она входит в блок catch и говорит: «Не удалось создать файл!» Spring Data JPA Как использовать ноль Kotlin вместо необязательного Могу ли я использовать @Bean из AndroidAnnotation в Котлине? AlerDialog с настраиваемой компоновкой Общая функция расширения Котлина с базовыми типами без отражения API Не удается получить доступ к внутренним компонентам из тестового источника с помощью Android Настройка прокладки программно и через xml Как обеспечить класс kotlin для конфигураций запуска eclipse? Котлинское преобразование объектов в объекты Почему строка интерполяции Kotlin объединяет строки в Java? Как отладить ошибку «Не удалось разрешить ошибку com.google.android:android» в Anko