Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Kotlinの関数参照 #Kotlin_Sansan
Search
Taro Nagasawa
April 07, 2017
Programming
1
760
Kotlinの関数参照 #Kotlin_Sansan
Qiita記事をそのままスライド化。
http://qiita.com/ngsw_taro/items/f2f70296828ee75491a2
Taro Nagasawa
April 07, 2017
Tweet
Share
More Decks by Taro Nagasawa
See All by Taro Nagasawa
Android開発者のための Kotlin Multiplatform入門
ntaro
0
530
Kotlin 最新動向2022 #tfcon #techfeed
ntaro
1
2.2k
#Ubie 狂気の認知施策と選考設計
ntaro
13
13k
UbieにおけるサーバサイドKotlin活用事例
ntaro
1
1.1k
KotlinでSpring 完全理解ガイド #jsug
ntaro
6
3.4k
Kotlinでサーバサイドを始めよう!
ntaro
1
950
Androidからサーバーサイドまで!プログラミング言語 Kotlinの魅力 #devboost
ntaro
5
2.6k
Kotlin Contracts #m3kt
ntaro
4
3.9k
How_to_Test_Server-side_Kotlin.pdf
ntaro
1
470
Other Decks in Programming
See All in Programming
コミュニティ駆動 AWS CDK ライブラリ「Open Constructs Library」 / community-cdk-library
gotok365
2
200
Datadog Workflow Automation で圧倒的価値提供
showwin
1
100
Unity Android XR入門
sakutama_11
0
170
『GO』アプリ データ基盤のログ収集システムコスト削減
mot_techtalk
0
140
Generating OpenAPI schema from serializers throughout the Rails stack - Kyobashi.rb #5
envek
1
330
『テスト書いた方が開発が早いじゃん』を解き明かす #phpcon_nagoya
o0h
PRO
6
2.2k
Jakarta EE meets AI
ivargrimstad
0
120
Multi Step Form, Decentralized Autonomous Organization
pumpkiinbell
1
830
仕様変更に耐えるための"今の"DRY原則を考える
mkmk884
9
2.9k
昭和の職場からアジャイルの世界へ
kumagoro95
1
410
メンテが命: PHPフレームワークのコンテナ化とアップグレード戦略
shunta27
0
280
クリーンアーキテクチャから見る依存の向きの大切さ
shimabox
4
920
Featured
See All Featured
Facilitating Awesome Meetings
lara
52
6.2k
A better future with KSS
kneath
238
17k
Writing Fast Ruby
sferik
628
61k
It's Worth the Effort
3n
184
28k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
133
33k
The World Runs on Bad Software
bkeepers
PRO
67
11k
GraphQLとの向き合い方2022年版
quramy
44
13k
StorybookのUI Testing Handbookを読んだ
zakiyama
28
5.5k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
30
2.2k
Six Lessons from altMBA
skipperchong
27
3.6k
Why You Should Never Use an ORM
jnunemaker
PRO
55
9.2k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
10
500
Transcript
Kotlinの関数参照 2017-04-04 Kotlin勉強会@Sansan 長澤 太郎
自己紹介 • たろう @ngsw_taro • エムスリー株式会社のAndroidエンジニア • Kotlinエバンジェリスト(自称) • 著書「Kotlinスタートブック」
もくじ 1. 関数参照 2. レシーバが未定のメソッド参照 3. レシーバが確定のメソッド参照 4. プロパティも関数
1. 関数参照
関数オブジェクト • Kotlinでは定義済みの関数のオブジェクトを得ること ができる • 関数オブジェクトを変数に代入したり、別の関数の引 数に渡したり、持ち回して便利に使える。 • 必ずしもオブジェクトではない(ヒント: インライン関
数)
コード例 // 普通の関数 fun succ(n: Int): Int = n +
1 // 関数オブジェクトを取得し、変数に代入 val myFunc: (Int)->Int = ::succ // ^^^^^^^^^^ 関数型 // メソッド呼び出しによる元の関数の計算を実行 myFunc.invoke(5) //=> 6 // 演算子オーバロードによる関数らしい記述 myFunc(7) //=> 8
応用例 // 高階関数の引数に「関数参照」を渡す listOf(1, 2, 3).map(::succ) //=> [2, 3, 4]
// ラムダ式を使えば同じ listOf(1, 2, 3).map { succ(it) } //=> [2, 3, 4] • ラムダ式は、文を手続き的に記述していく • 関数参照は、宣言的な記述になる
2. レシーバが未定のメソッド参照
メソッド参照 • メソッドのオブジェクトも取得できる • この場合は、レシーバが未定 // 「型::メソッド名」という書式で取得 val foo: String.()->String
= String::reversed // ^^^^^^^^^^^^^^^^^ 関数型 // メソッドっぽく呼び出せる "Kotlin".foo() //=> niltoK
拡張関数もOK fun String.bold(): String = "**$this**" val baz: String.()->String =
String::bold "Sansan".baz() //=> **Sansan**
普通の関数型にもなるよ • 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**
高階関数で効果を発揮 "Hello".let { it.bold() } "Hello".let(String::bold) もしString.()->Stringが(String)->Stringと みなせなかったら、2行目の書き方がNGです。
3. レシーバが確定のメソッド参照
Bound Function Reference • bound = 束縛された → レシーバが確定してるメソッド参照 •
Kotlin 1.1から使用できる
コード例 // 「オブジェクト::メソッド名」の書式で取得 val succ: (Int)->Int = 1::plus succ(5) //=>
6 userRepository.findById(123L) ?.let { user -> user.copy(blocked = true) } ?.let(userRepository::update)
4. プロパティも関数
プロパティも関数として扱える val prop: KProperty1<String, Int> = String::length prop.get("Taro") //=> 4
val func: (String) -> Int = prop func("Taro") //=> 4
高階関数で効果を発揮 listOf("foo", "wa").map { it.length } // => [3, 2]
listOf("foo", "wa").map(String::length) // => [3, 2] もしKProperty1<String, Int>が (String)->Stringとみなせなかったら、2行目の書き 方がNGです。
まとめ • 関数オブジェクトを使うと宣言的な記述ができる • ::hoge: 関数参照 • Foo::bar: メソッド参照 •
foo::bar: レシーバ固定メソッド参照 (Bound Function Reference) • プロパティも関数オブジェクトになれる