Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Kotlinの関数参照 #Kotlin_Sansan

Kotlinの関数参照 #Kotlin_Sansan

Qiita記事をそのままスライド化。
http://qiita.com/ngsw_taro/items/f2f70296828ee75491a2

Taro Nagasawa

April 07, 2017
Tweet

More Decks by Taro Nagasawa

Other Decks in Programming

Transcript

  1. コード例 // 普通の関数 fun succ(n: Int): Int = n +

    1 // 関数オブジェクトを取得し、変数に代入 val myFunc: (Int)->Int = ::succ // ^^^^^^^^^^ 関数型 // メソッド呼び出しによる元の関数の計算を実行 myFunc.invoke(5) //=> 6 // 演算子オーバロードによる関数らしい記述 myFunc(7) //=> 8
  2. 応用例 // 高階関数の引数に「関数参照」を渡す listOf(1, 2, 3).map(::succ) //=> [2, 3, 4]

    // ラムダ式を使えば同じ listOf(1, 2, 3).map { succ(it) } //=> [2, 3, 4] • ラムダ式は、文を手続き的に記述していく • 関数参照は、宣言的な記述になる
  3. 普通の関数型にもなるよ • A.(B)->Cという型は、(A, B)->Cと同じっぽい fun String.bold(): String = "**$this**" //

    型どっちでもOK val aaa: String.()->String = String::bold val bbb: (String)->String = aaa // 呼び出し方どっちでもOK "hoge".aaa() //=> **hoge** aaa("fuga") //=> **fuga**
  4. コード例 // 「オブジェクト::メソッド名」の書式で取得 val succ: (Int)->Int = 1::plus succ(5) //=>

    6 userRepository.findById(123L) ?.let { user -> user.copy(blocked = true) } ?.let(userRepository::update)
  5. 高階関数で効果を発揮 listOf("foo", "wa").map { it.length } // => [3, 2]

    listOf("foo", "wa").map(String::length) // => [3, 2] もしKProperty1<String, Int>が (String)->Stringとみなせなかったら、2行目の書き 方がNGです。
  6. まとめ • 関数オブジェクトを使うと宣言的な記述ができる • ::hoge: 関数参照 • Foo::bar: メソッド参照 •

    foo::bar: レシーバ固定メソッド参照 (Bound Function Reference) • プロパティも関数オブジェクトになれる