Kotlin函数参考

records为流/集合,并extract将数据转换为此类集合的元素的函数。

Kotlin有没有办法写出来?

 records.map {extract(it)} 

没有明确地应用(it)

例如records.map(extract)records.map(extract)

  • 如果extract是一个函数类型(T) -> RT.() -> 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