2017-02-27 8 views
7

recordsをストリーム/コレクションとし、データをそのようなコレクションの要素から変換する関数とする。コトリン関数の参照

明示的(it)を適用せずに

records.map {extract(it)} 

を書くためKotlinにおける方法はありますか?

など。 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) 
    

    例:Kotlin 1以来

    fun Int.rem2() = this % 2 
    
    listOf("abc", "defg").map(String::length).map(Int::rem2) // [1, 0] 
    
  • 。1extract部材、または1つの引数を受け入れるクラスSomeClassの拡張機能の場合、いくつかの受信機foomake a bound callable reference缶:

    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) -> R又はT.() -> Rの値(ローカル変数、プロパティ、パラメータ)である場合kotlinドキュメント上の関数参照例 https://kotlinlang.org/docs/reference/reflection.html#function-references

+4

このコードは、意図した通りに動作しません。 'records'の各項目は関数参照にマップされ、N個の同一項目:: :: extract'のリストを取得します。 – hotkey