Kotlin功能参考

时间:2017-02-27 21:24:27

标签: functional-programming kotlin

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

Kotlin有没有办法写

records.map {extract(it)} 

没有明确地应用(it)

E.g。 records.map(extract)records.map {extract}

2 个答案:

答案 0 :(得分:10)

  • 如果extract是某些(T) -> RT.() -> R的函数类型TR的值(局部变量,属性,参数)然后你可以直接将它传递给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]
    

(runnable demo with all the code samples above)

答案 1 :(得分:1)

您可以使用方法引用(类似于Java)。

records.map {::extract} 

看一下kotlin docs上的函数引用示例 https://kotlinlang.org/docs/reference/reflection.html#function-references