让records
成为流/集合和extract
函数,它将数据转换为此类集合的元素。
Kotlin有没有办法写
records.map {extract(it)}
没有明确地应用(it)
?
E.g。 records.map(extract)
或records.map {extract}
答案 0 :(得分:10)
如果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
是顶级单参数函数或本地单参数函数,您可以make a function reference as ::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
的成员或扩展函数,则可make a bound callable reference一些接收者foo
:
records.map(foo::extract)
records.map(this::extract) // to call on `this` receiver
实施例
listOf("abc", "xyz").map("prefix"::plus) // [prefixabc, prefixxyz]
答案 1 :(得分:1)
您可以使用方法引用(类似于Java)。
records.map {::extract}
看一下kotlin docs上的函数引用示例 https://kotlinlang.org/docs/reference/reflection.html#function-references