Submit Search
明日からちょっと KotlinでAndroidが書きたくなる(かもしれない?)SAM変換と拡張関数
2 likes
6,419 views
Ryota Murohoshi
2014/07/04 かわいいKotlin勉強会で行った発表の資料です
Read more
1 of 44
Download now
Download to read offline
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
More Related Content
PPTX
Hubotを使ってbotをつくろう!
Daisuke Kikuchi
PDF
SIerアーキテクト視点でみたKotlinの紹介
Shinichi Kozake
PDF
KotlinでROSノードを書いてみた
Naoki Iwata
PDF
Kotlinソースコード探訪
yy yank
PDF
とある現場のシステムアーキテクチャ
Shinichi Kozake
PPTX
Kotlin
Shumpei Hozumi
PDF
kotlinについて
隆史 川中
PDF
Kotlinで快適Android開発 #W8lt
Junpei Matsuda
Hubotを使ってbotをつくろう!
Daisuke Kikuchi
SIerアーキテクト視点でみたKotlinの紹介
Shinichi Kozake
KotlinでROSノードを書いてみた
Naoki Iwata
Kotlinソースコード探訪
yy yank
とある現場のシステムアーキテクチャ
Shinichi Kozake
Kotlin
Shumpei Hozumi
kotlinについて
隆史 川中
Kotlinで快適Android開発 #W8lt
Junpei Matsuda
Viewers also liked
(9)
PDF
もう一度Kotlinの話をしよう #ndsmeetup4
Yukiya Nakagawa
PDF
Kotlinあるある言いたい
yy yank
PDF
Kotlinでマッチョする話
Shinobu Okano
PDF
Kotlin: Why Do You Care?
intelliyole
PDF
UnityでC#6.0が使える未来がそろそろ来そう!
Ryota Murohoshi
PDF
minne の API 改善
Toshihiro Gotou
PDF
普段C#を使っている僕から見たKotlin
Ryota Murohoshi
PDF
Jvm言語とJava、切っても切れないその関係
yy yank
PDF
Android学ぶを君へ。生き抜くためのナレッジ共有
Shinobu Okano
もう一度Kotlinの話をしよう #ndsmeetup4
Yukiya Nakagawa
Kotlinあるある言いたい
yy yank
Kotlinでマッチョする話
Shinobu Okano
Kotlin: Why Do You Care?
intelliyole
UnityでC#6.0が使える未来がそろそろ来そう!
Ryota Murohoshi
minne の API 改善
Toshihiro Gotou
普段C#を使っている僕から見たKotlin
Ryota Murohoshi
Jvm言語とJava、切っても切れないその関係
yy yank
Android学ぶを君へ。生き抜くためのナレッジ共有
Shinobu Okano
Ad
Similar to 明日からちょっと KotlinでAndroidが書きたくなる(かもしれない?)SAM変換と拡張関数
(18)
PDF
かわいいKotlinでAndroidアプリをつくろう
gyro_s
PDF
Kotlin勉強会 in ehime
Eigoro Yamamura
PDF
KotlinAndroidLibを使ってみた
豊明 尾古
PDF
Kotlinアンチパターン
Recruit Lifestyle Co., Ltd.
PPTX
Java で書かれたAndroid アプリに Kotlin を適用させていく
Kenichi Tatsuhama
PPTX
ミクシィ 21卒向け Android研修
akkuma
PDF
3分で作る Kotlin Friendly な API
Hiroshi Kikuchi
PPTX
Kotlin 使いになりました
Kenichi Tatsuhama
PDF
20170618 Google I/O報告会in福岡
mokelab
PPTX
Java で書かれた Android アプリに Kotlin を適用させていく
Kenichi Tatsuhama
ODP
OSC2011 Androidハンズオン
Katsumi Honda
PDF
Potato03 KotlinでAndroidアプリ開発(後編)
Toshihiro Yagi
PDF
Kotlinにお触り
Shinobu Okano
PPTX
DroidKaigi アプリの内部を見る
Kenichi Tatsuhama
PPTX
Kotlin が公式サポートになったので Kotlin の話
Kenichi Tatsuhama
PDF
ScalaでAndroidアプリ開発
papamitra
PPTX
モダンなAndroidアプリ開発勉強会
Shoichi Kakizaki
PDF
Refactoring point of Kotlin application
Recruit Lifestyle Co., Ltd.
かわいいKotlinでAndroidアプリをつくろう
gyro_s
Kotlin勉強会 in ehime
Eigoro Yamamura
KotlinAndroidLibを使ってみた
豊明 尾古
Kotlinアンチパターン
Recruit Lifestyle Co., Ltd.
Java で書かれたAndroid アプリに Kotlin を適用させていく
Kenichi Tatsuhama
ミクシィ 21卒向け Android研修
akkuma
3分で作る Kotlin Friendly な API
Hiroshi Kikuchi
Kotlin 使いになりました
Kenichi Tatsuhama
20170618 Google I/O報告会in福岡
mokelab
Java で書かれた Android アプリに Kotlin を適用させていく
Kenichi Tatsuhama
OSC2011 Androidハンズオン
Katsumi Honda
Potato03 KotlinでAndroidアプリ開発(後編)
Toshihiro Yagi
Kotlinにお触り
Shinobu Okano
DroidKaigi アプリの内部を見る
Kenichi Tatsuhama
Kotlin が公式サポートになったので Kotlin の話
Kenichi Tatsuhama
ScalaでAndroidアプリ開発
papamitra
モダンなAndroidアプリ開発勉強会
Shoichi Kakizaki
Refactoring point of Kotlin application
Recruit Lifestyle Co., Ltd.
Ad
More from Ryota Murohoshi
(16)
PDF
【Unity】気づいたら加わっていたあいつ【もくもく】
Ryota Murohoshi
PDF
【ハピバ】未来に備えたKotlin、大好きだぜ!【Kotlin 1.0】
Ryota Murohoshi
PDF
「var禁止」禁止
Ryota Murohoshi
PDF
Javaのバージョニング問題の話しよっか
Ryota Murohoshi
PDF
LINQ、Select連弾ってやります?
Ryota Murohoshi
PDF
C#のList_TがIListを実装している件
Ryota Murohoshi
PDF
どうしてこのコードエラーになるんですか?
Ryota Murohoshi
PDF
広告ネイティブプラグインの辛かった話しよっか
Ryota Murohoshi
PDF
UnityでC#を勉強しはじめた私の主張
Ryota Murohoshi
PDF
T4使ってみた
Ryota Murohoshi
PDF
UnityでのLINQ活用例
Ryota Murohoshi
PDF
私とUnityとLINQと
Ryota Murohoshi
PDF
「LINQ」っていう名前だけでも 覚えて帰ってください!
Ryota Murohoshi
PDF
JXUGのLTだけれどもUnity+iOS+LINQの話をしようと思う!
Ryota Murohoshi
PDF
RxJava初心者の私が良いと思ったやり方、素敵だと思った資料など
Ryota Murohoshi
PDF
共変戻り値型って知ってますか?
Ryota Murohoshi
【Unity】気づいたら加わっていたあいつ【もくもく】
Ryota Murohoshi
【ハピバ】未来に備えたKotlin、大好きだぜ!【Kotlin 1.0】
Ryota Murohoshi
「var禁止」禁止
Ryota Murohoshi
Javaのバージョニング問題の話しよっか
Ryota Murohoshi
LINQ、Select連弾ってやります?
Ryota Murohoshi
C#のList_TがIListを実装している件
Ryota Murohoshi
どうしてこのコードエラーになるんですか?
Ryota Murohoshi
広告ネイティブプラグインの辛かった話しよっか
Ryota Murohoshi
UnityでC#を勉強しはじめた私の主張
Ryota Murohoshi
T4使ってみた
Ryota Murohoshi
UnityでのLINQ活用例
Ryota Murohoshi
私とUnityとLINQと
Ryota Murohoshi
「LINQ」っていう名前だけでも 覚えて帰ってください!
Ryota Murohoshi
JXUGのLTだけれどもUnity+iOS+LINQの話をしようと思う!
Ryota Murohoshi
RxJava初心者の私が良いと思ったやり方、素敵だと思った資料など
Ryota Murohoshi
共変戻り値型って知ってますか?
Ryota Murohoshi
明日からちょっと KotlinでAndroidが書きたくなる(かもしれない?)SAM変換と拡張関数
1.
明日からちょっと KotlinでAndroidが書きたくなる(かもしれない?) SAM変換と拡張関数 室星亮太 2014/7/4(金))第2回)かわいいKotlin勉強会)#jkug
2.
突然ですが質問です!
3.
Kotlin書いたことある方?
4.
「Kotlin'書いたことない」 ってイベントページに書いたけれど 本当は書いたことある方?
5.
Androidアプリ 開発したことある方?
6.
ありがとうございました!
7.
お前だれよ • 名前":"室星亮太 • 仕事":"Androidアプリ開発(Java)、Unityゲーム開発(C#) •
Twi6er":"@RyotaMurohoshi • 投稿先":"h6p://qiita.com/RyotaMurohoshi • 興味":"Kotlin,"Groovy,"C#,"Unity,"SonyのWearable"Device
8.
AndroidアプリをJavaで開発していて、 「なんでこんなに冗長なコードが必要なんだ!」 ってイラっとすることはありませんか?
9.
私はあります! C#を業務で使い始めたりしたり、 Groovyをほんのちょっと勉強したら、 「なんでJava、〇〇できないのー!」 って、イラッとなりました
10.
そこでKotlinですね!
11.
明日からちょっと KotlinでAndroidが書きたくなる(かもしれない?) SAM変換と拡張関数 と題して今日はLTします!
12.
いらっとする冗長なコード1 button.setOnClickListener(new View.OnClickListener() { @Override public
void onClick(View v) { Log.v(TAG, "clicked"); } }); どんなAndroid入門書にも載っている、アクティビティでよくみるコード Kotlinで書いたやつと比べると、冗長なのが一目瞭然!
13.
Kotlinだとすっきり button.setOnClickListener { Log.v(TAG,
"clicked") }
14.
Java、Kotlinそれぞれのクリックリスナー Kotlin button.setOnClickListener { Log.v(TAG,
"clicked") } Java button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.v(TAG, "clicked!"); } });
15.
行数が短くなったことではなく、 「冗長な部分は書く必要がなく 本質的なことだけ書けばよくなった」 というのがミソ
16.
Javaのコードをもう一度見てみましょう button.setOnClickListener(new View.OnClickListener() {
// new以降本質じゃない @Override // <- 本質じゃない public void onClick(View v) { // <- 本質じゃない Log.v(TAG, "clicked!"); } // <- 本質じゃない }); // <- 本質じゃない Javaは本質じゃない部分が多い。Kotlinは本質のみを記述すればいい Kotlinはなぜあんな記述ができるのか?
17.
Single'Abstract'Method'Conversions SAM変換 h"p://blog.jetbrains.com/kotlin/2013/08/kotlin;m6;is;here/
18.
SAM$インターフェース 一つの(Single))抽象(Abstract))メソッド(Method) をもつインターフェース • Runnable):)void)run() • View.OnClickListener):)void)onClick(View)v) •
Response.Listener<T>):)void)onResponse(T)response)) など、他にもたくさん
19.
SAM変換 関数リテラル!">!SAMインターフェース!な変換 Kotlinでは、SAMインターフェースを引数にとるメソッドで、 引数の型と順序そして返値型が一致する関数リテラルを渡すと インターフェースに変換してくれる SAMインターフェースが必要な所も、関数リテラルでスッキリ!
20.
SAM変換できる例 button.setOnClickListener( { (v
: View): Unit -> Log.v(TAG, "clicked") }) button.setOnClickListener( { v -> Log.v(TAG, "clicked")}) button.setOnClickListener{ v -> Log.v(TAG, "clicked") } button.setOnClickListener{ Log.v(TAG, "clicked") } val listener : (View) -> Unit = {v -> Log.v(TAG, "clicked") } //or val listener : (View) -> Unit = { Log.v(TAG, "click") } //or val listener = { (v : View) : Unit -> Log.v(TAG, "clicked") } button.setOnClickListener(listener)
21.
SAM変換できない例 // 下記はコンパイルエラー // Type
mismatch val listener : View.OnClickListener = { (v : View) : Unit -> Log.v(TAG, "clicked") } // 下記は実行時エラー // java.lang.ClassCastException val listener = { (v : View) : Unit -> Log.v(TAG, "clicked") } as View.OnClickListener 引数に関数リテラルを渡さないといけない
22.
SAM変換で無駄コードを無くせますね! もう一例 VolleyのStringRequest
23.
VolleyのStringRequest0Java版 StringRequest request =
new StringRequest( "https://www.google.co.jp/", new Response.Listener<String>() { @Override public void onResponse(String response) { Toast.makeText(getApplicationContext(), response, Toast.LENGTH_LONG).show(); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { Toast.makeText(getApplicationContext(), "onErrorResponse", Toast.LENGTH_LONG).show(); } } ); 無駄な部分が多く、縦に長い...
24.
VolleyのStringRequest0Kotlin版 val request =
StringRequest( url = "https://www.google.co.jp/", listener = { response -> Toast.makeText(this, response, Toast.LENGTH_LONG).show() }, errorListener = { volleyError -> Toast.makeText(this, "onErrorResponse", Toast.LENGTH_LONG).show() } ); 型パラーメータがあるインターフェースもSAM変換可能 名前付き引数で可読性アップ
25.
ちょっとGroovyもみてみましょう GroovyもSAM変換が使えるようです。 button.setOnClickListener { v
-> Toas.makeText(this, "click", Toast.LENGTH_LONG).show() } Groovy&2.2からas演算子がいらなくなったそうです。 h"p://groovy.codehaus.org/Groovy+2.2+release+notes
26.
ちょっとGroovyもみてみましょう SAMインターフェースだけでなく、複数メソッドを持つインターフェースも Map+クロージャー+as演算子でこんな感じに! viewPager.setOnPageChangeListener ([ onPageScrollStateChanged: {
state -> Log.v(TAG, state) }, onPageScrolled : { position, positionOffset, positionOffsetPixels -> /*略*/ }, onPageSelected : { position -> Log.v(TAG, position) } ] as ViewPager.OnPageChangeListener) h"p://groovy.codehaus.org/Groovy+way+to+implement+interfaces
27.
実はAndroidStudioとIntelliJだと 一つだけメソッドを実装した匿名クラスがいい感じに!(SAM型も) button.setOnClickListener((v) -> {Log.v(TAG,
"clicked");}); IDE上ではいい感じで折り畳まれてますが、 githubとかでコードリビューするときは、 ほら畳まれないし... h"p://qiita.com/RyotaMurohoshi/items/0ce799c747d91756131a
28.
以上 SAM変換でした。
29.
いらっとする冗長なコード2 ImageView imageView =
(ImageView)findViewById(R.id.image_view); どんなAndroid入門書にも載っている、アクティビティでよくみるコード けれど「ImageView」ってなんで2回書く必要あるん?型推論してくれてもいいじゃん!
30.
とりあえず継承します? Ac#vityを継承したクラスBaseAc#vityにて、こんなメソッド定義すれば、 public <T extends
View> T findById(int viewId) { return (T)findViewById(viewId); } BaseAc'vityを更に継承したクラスでは、こんな感じでキャスト不要になりますね ImageView imageView = findById(R.id.image_view);
31.
けど継承って • 継承むずい • 「継承が許されるのは小学生までだよね」、だと... •
Ac$vityのサブクラスいくつかあるけど、全部に更にサブクラス 作ってメソッド定義する? ちょっとないかな...
32.
さてどうしましょう? • 冗長な記述が頻発したり、よく使う処理がある • Ac$vityとかに、メソッドを追加したい! •
けど継承したくない)or)できない
33.
Extension)Funcitons 拡張関数 h"p://confluence.jetbrains.com/display/Kotlin/Extension+func=ons
34.
Extension)Funcitons(拡張関数)とは • 継承せずにメソッドを追加できる" • 継承禁止なクラスにもメソッドを追加できる •
privateなメンバにアクセスはできない • メソッドをオーバーライドはできない
35.
Extension)Func-onsの例)定義側 extensions.kt内にて package com.mrstar.extensions import android.app.Activity import
android.view.View fun <T : View> Activity.findById (id : Int) : T = findViewById(id) as T
36.
Extension)Func-onsの例)利用側 package com.mrstar.android_with_kotlin // 略 import
com.mrstar.extensions.findById // <- 注目 public class MainActivity() : FragmentActivity() { // <- 注目 protected override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val textView: ImageView = findById (R.id.image_view) // <- 注目 } }
37.
• fun$ClassName.methodName(hoge$:$Hoge)$:$Fuga"みたいな感じで メソッドを定義します • 定義した拡張メソッドをimportします •
そうすると普通のメソッドのように使えます • この例だとAc+vityのサブクラスだけでなく、 FragmentAc+vity、Ac+onBarAc+vity、他のサブクラスでも使え ます(継承で定義するなら、各クラスにメソッド定義が必要)
38.
Extension)Func-onsを使えば... • 継承しなくてもメソッドを追加できますね • たくさんのクラスにメソッドを追加しなくてもいいですね •
自作のメソッドで冗長な記述をスッキリできますね!
39.
ちょっとC#もみてみましょう C#にも拡張関数と同じような拡張メソッドがあります。 // 定義側 public static
class StringExtensions { public static string Decorate(this string str, string symbol) { return string.Format("{0}{1}{2}", symbol, str, symbol); } } //利用側 string decoratedMessage = "Hello!".Decorate("===") こんな感じで、sta$cなクラスにsta$cなメソッドとして拡張メソッドを定義します。
40.
ちょっとC#もみてみましょう C#は • Javaのpackageアクセスのような、メンバを同じ名前空間だけに 公開するという制限がない • privateでsta.cな入れ子のクラスは作れる •
が↑なクラスでは拡張メソッドを定義できない このクラスにだけ、この名前空間でだけ使えるという拡張メソッドを定義できない!
41.
一方Kotlinでは • packageにその名前空間とそのサブ名前空間限定で • クラス内にprivateアクセスレベルで •
関数内にローカル関数内として、ローカルスコープで Kotlinだと拡張関数を定義できる!
42.
以上 拡張関数でした。
43.
質問ありますか?
44.
ご清聴ありがとうございました! SAM変換について(Qiita) h"p://qiita.com/RyotaMurohoshi
Download