Kotlin函数参考
设records
为流/集合,并extract
将数据转换为此类集合的元素的函数。
Kotlin有没有办法写出来?
records.map {extract(it)}
没有明确地应用(it)
?
例如records.map(extract)
或records.map(extract)
-
如果
extract
是一个函数类型(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]
(上面所有代码示例的可运行演示)
你可以使用方法引用(类似于Java)。
records.map {::extract}
看看函数参考kotlin文档的例子https://kotlinlang.org/docs/reference/reflection.html#function-references