Пусть 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