2017-02-27 125 views
7

records是流/收集和extract功能,其將數據形成這種集合的元素。科特林函數參照

是否有科特林的方式來寫

records.map {extract(it)} 

沒有明確地將(it)

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

回答

10
  • 例子和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] 
    
  • 由於科特林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

你可以使用方法引用(類似於Java)。

records.map {::extract} 

採取如果extract爲一些T一個功能類型(T) -> RT.() -> R的值(局部變量,屬性,參數)來看看函數引用上科特林文檔 https://kotlinlang.org/docs/reference/reflection.html#function-references

+4

此代碼不會執行它的用途。每個'records'項目將被映射到函數引用,並且您將得到N個相同項目':: extract'的列表。 – hotkey