2017-02-27 11 views
7

Lassen Sie records Stream/Sammlung sein und extract Funktion, die Daten aus einem Element einer solchen Sammlung transformiert.Kotlin Funktionsreferenz

Gibt es eine Möglichkeit in Kotlin

records.map {extract(it)} 

ohne explizit (it) Anwendung zu schreiben?

z. records.map(extract) oder records.map {extract}

Antwort

10
  • Wenn extract ein Wert ist (lokale Variable, Eigenschaft, Parameter) eines funktionalen Typ (T) -> R oder T.() -> R für einige T und R, dann können Sie es direkt an map weiterleiten:

    records.map(extract) 
    

    Beispiel:

    val upperCaseReverse: (String) -> String = { it.toUpperCase().reversed() } 
    
    listOf("abc", "xyz").map(upperCaseReverse) // [CBA, ZYX] 
    
  • Wenn extract ein Top-Level-Argument Funktion oder ein lokales Argument Funktion ist, können Sie make a function reference as ::extract und übergeben es an map:

    records.map(::extract) 
    

    Beispiel :

    fun rotate(s: String) = s.drop(1) + s.first() 
    
    listOf("abc", "xyz").map(::rotate) // [bca, yzx] 
    
  • Wenn es ein Mitglied oder eine Erweiterungsfunktion einer Klasse SomeClass ist, die keine Argumente oder eine Eigenschaft von SomeClass akzeptiert, können Sie es als SomeClass::extract verwenden. In diesem Fall sollte records Elemente SomeType enthalten, die als Empfänger für extract verwendet werden.

    records.map(SomeClass::extract) 
    

    Beispiel:

    fun Int.rem2() = this % 2 
    
    listOf("abc", "defg").map(String::length).map(Int::rem2) // [1, 0] 
    
  • Da Kotlin 1.1, wenn extract ein Mitglied oder eine Erweiterung in Abhängigkeit von einer Klasse SomeClass Annahme ein Argument, man kann make a bound callable reference mit einigen Empfänger foo:

    records.map(foo::extract) 
    records.map(this::extract) // to call on `this` receiver 
    

    Beispiel:

    listOf("abc", "xyz").map("prefix"::plus) // [prefixabc, prefixxyz] 
    

(runnable demo with all the code samples above)

1

könnten Sie Methodenreferenz (ähnlich wie Java) verwenden.

records.map {::extract} 

nehmen ein Blick auf die Funktionsbeispiele auf Kotlin docs verweist https://kotlinlang.org/docs/reference/reflection.html#function-references

+4

Dieser Code tut nicht, was er beabsichtigt ist. Jedes Element von 'records' wird der Funktionsreferenz zugeordnet, und Sie erhalten eine Liste von N identischen Elementen' :: extract'. – hotkey

Verwandte Themen