Soumettre la recherche
Mettre en ligne
明日からちょっと KotlinでAndroidが書きたくなる(かもしれない?)SAM変換と拡張関数
•
2 j'aime
•
6,362 vues
Ryota Murohoshi
Suivre
2014/07/04 かわいいKotlin勉強会で行った発表の資料です
Lire moins
Lire la suite
Signaler
Partager
Signaler
Partager
1 sur 44
Télécharger maintenant
Télécharger pour lire hors ligne
Recommandé
Hubotを使ってbotをつくろう!
Hubotを使ってbotをつくろう!
Daisuke Kikuchi
SIerアーキテクト視点でみたKotlinの紹介
SIerアーキテクト視点でみたKotlinの紹介
Shinichi Kozake
KotlinでROSノードを書いてみた
KotlinでROSノードを書いてみた
Naoki Iwata
Kotlinソースコード探訪
Kotlinソースコード探訪
yy yank
とある現場のシステムアーキテクチャ
とある現場のシステムアーキテクチャ
Shinichi Kozake
Kotlin
Kotlin
Shumpei Hozumi
kotlinについて
kotlinについて
隆史 川中
Kotlinで快適Android開発 #W8lt
Kotlinで快適Android開発 #W8lt
Junpei Matsuda
Recommandé
Hubotを使ってbotをつくろう!
Hubotを使ってbotをつくろう!
Daisuke Kikuchi
SIerアーキテクト視点でみたKotlinの紹介
SIerアーキテクト視点でみたKotlinの紹介
Shinichi Kozake
KotlinでROSノードを書いてみた
KotlinでROSノードを書いてみた
Naoki Iwata
Kotlinソースコード探訪
Kotlinソースコード探訪
yy yank
とある現場のシステムアーキテクチャ
とある現場のシステムアーキテクチャ
Shinichi Kozake
Kotlin
Kotlin
Shumpei Hozumi
kotlinについて
kotlinについて
隆史 川中
Kotlinで快適Android開発 #W8lt
Kotlinで快適Android開発 #W8lt
Junpei Matsuda
もう一度Kotlinの話をしよう #ndsmeetup4
もう一度Kotlinの話をしよう #ndsmeetup4
Yukiya Nakagawa
Kotlinあるある言いたい
Kotlinあるある言いたい
yy yank
Kotlinでマッチョする話
Kotlinでマッチョする話
Shinobu Okano
Kotlin: Why Do You Care?
Kotlin: Why Do You Care?
intelliyole
UnityでC#6.0が使える未来がそろそろ来そう!
UnityでC#6.0が使える未来がそろそろ来そう!
Ryota Murohoshi
minne の API 改善
minne の API 改善
Toshihiro Gotou
普段C#を使っている僕から見たKotlin
普段C#を使っている僕から見たKotlin
Ryota Murohoshi
Jvm言語とJava、切っても切れないその関係
Jvm言語とJava、切っても切れないその関係
yy yank
Android学ぶを君へ。生き抜くためのナレッジ共有
Android学ぶを君へ。生き抜くためのナレッジ共有
Shinobu Okano
Web socket and gRPC
Web socket and gRPC
TIS Inc
ngCore engine for mobage platform
ngCore engine for mobage platform
Toru Yamaguchi
もっと早く知りたかったプログラミング技法9選
もっと早く知りたかったプログラミング技法9選
Masayuki Akiyama
CordovaでAngularJSアプリ開発
CordovaでAngularJSアプリ開発
アシアル株式会社
gumiStudy#5 JavaScript でネイティブiPhone/Androidアプリを作る
gumiStudy#5 JavaScript でネイティブiPhone/Androidアプリを作る
gumilab
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用
Yatabe Terumasa
Retrofit2 &OkHttp でAndroidのHTTP通信が快適だにゃん
Retrofit2 &OkHttp でAndroidのHTTP通信が快適だにゃん
Yukari Sakurai
Titanium MobileでOAuth
Titanium MobileでOAuth
Kosuke Isobe
JavaScript経験者のためのGo言語入門
JavaScript経験者のためのGo言語入門
Shohei Arai
これからHTML5を書く人のためのセキュリティ - HTML5など勉強会
これからHTML5を書く人のためのセキュリティ - HTML5など勉強会
yoshinori matsumoto
Mobylet20100613
Mobylet20100613
Shin Takeuchi
2008.10.18 L4u Tech Talk
2008.10.18 L4u Tech Talk
mitamex4u
Groovy Bootcamp 2015 by JGGUG
Groovy Bootcamp 2015 by JGGUG
Uehara Junji
Contenu connexe
En vedette
もう一度Kotlinの話をしよう #ndsmeetup4
もう一度Kotlinの話をしよう #ndsmeetup4
Yukiya Nakagawa
Kotlinあるある言いたい
Kotlinあるある言いたい
yy yank
Kotlinでマッチョする話
Kotlinでマッチョする話
Shinobu Okano
Kotlin: Why Do You Care?
Kotlin: Why Do You Care?
intelliyole
UnityでC#6.0が使える未来がそろそろ来そう!
UnityでC#6.0が使える未来がそろそろ来そう!
Ryota Murohoshi
minne の API 改善
minne の API 改善
Toshihiro Gotou
普段C#を使っている僕から見たKotlin
普段C#を使っている僕から見たKotlin
Ryota Murohoshi
Jvm言語とJava、切っても切れないその関係
Jvm言語とJava、切っても切れないその関係
yy yank
Android学ぶを君へ。生き抜くためのナレッジ共有
Android学ぶを君へ。生き抜くためのナレッジ共有
Shinobu Okano
En vedette
(9)
もう一度Kotlinの話をしよう #ndsmeetup4
もう一度Kotlinの話をしよう #ndsmeetup4
Kotlinあるある言いたい
Kotlinあるある言いたい
Kotlinでマッチョする話
Kotlinでマッチョする話
Kotlin: Why Do You Care?
Kotlin: Why Do You Care?
UnityでC#6.0が使える未来がそろそろ来そう!
UnityでC#6.0が使える未来がそろそろ来そう!
minne の API 改善
minne の API 改善
普段C#を使っている僕から見たKotlin
普段C#を使っている僕から見たKotlin
Jvm言語とJava、切っても切れないその関係
Jvm言語とJava、切っても切れないその関係
Android学ぶを君へ。生き抜くためのナレッジ共有
Android学ぶを君へ。生き抜くためのナレッジ共有
Similaire à 明日からちょっと KotlinでAndroidが書きたくなる(かもしれない?)SAM変換と拡張関数
Web socket and gRPC
Web socket and gRPC
TIS Inc
ngCore engine for mobage platform
ngCore engine for mobage platform
Toru Yamaguchi
もっと早く知りたかったプログラミング技法9選
もっと早く知りたかったプログラミング技法9選
Masayuki Akiyama
CordovaでAngularJSアプリ開発
CordovaでAngularJSアプリ開発
アシアル株式会社
gumiStudy#5 JavaScript でネイティブiPhone/Androidアプリを作る
gumiStudy#5 JavaScript でネイティブiPhone/Androidアプリを作る
gumilab
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用
Yatabe Terumasa
Retrofit2 &OkHttp でAndroidのHTTP通信が快適だにゃん
Retrofit2 &OkHttp でAndroidのHTTP通信が快適だにゃん
Yukari Sakurai
Titanium MobileでOAuth
Titanium MobileでOAuth
Kosuke Isobe
JavaScript経験者のためのGo言語入門
JavaScript経験者のためのGo言語入門
Shohei Arai
これからHTML5を書く人のためのセキュリティ - HTML5など勉強会
これからHTML5を書く人のためのセキュリティ - HTML5など勉強会
yoshinori matsumoto
Mobylet20100613
Mobylet20100613
Shin Takeuchi
2008.10.18 L4u Tech Talk
2008.10.18 L4u Tech Talk
mitamex4u
Groovy Bootcamp 2015 by JGGUG
Groovy Bootcamp 2015 by JGGUG
Uehara Junji
モバイル開発@symfony
モバイル開発@symfony
Daichi Kamemoto
SlackのIncomingWebhooksとOutgoingWebhooksを使って電子工作と連携させてみよう
SlackのIncomingWebhooksとOutgoingWebhooksを使って電子工作と連携させてみよう
Shigeo Ueda
Jqm20120804 publish
Jqm20120804 publish
Takashi Okamoto
jQuery MobileとPhoneGapでスマートフォンアプリ楽々クッキング
jQuery MobileとPhoneGapでスマートフォンアプリ楽々クッキング
Takashi Okamoto
今からでも遅くないC#開発
今からでも遅くないC#開発
Kazunori Hamamoto
VSCodeで始めるAzure Static Web Apps開発
VSCodeで始めるAzure Static Web Apps開発
Yuta Matsumura
Tokyo GTUG Bootcamp2010
Tokyo GTUG Bootcamp2010
Takashi EGAWA
Similaire à 明日からちょっと KotlinでAndroidが書きたくなる(かもしれない?)SAM変換と拡張関数
(20)
Web socket and gRPC
Web socket and gRPC
ngCore engine for mobage platform
ngCore engine for mobage platform
もっと早く知りたかったプログラミング技法9選
もっと早く知りたかったプログラミング技法9選
CordovaでAngularJSアプリ開発
CordovaでAngularJSアプリ開発
gumiStudy#5 JavaScript でネイティブiPhone/Androidアプリを作る
gumiStudy#5 JavaScript でネイティブiPhone/Androidアプリを作る
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用
Retrofit2 &OkHttp でAndroidのHTTP通信が快適だにゃん
Retrofit2 &OkHttp でAndroidのHTTP通信が快適だにゃん
Titanium MobileでOAuth
Titanium MobileでOAuth
JavaScript経験者のためのGo言語入門
JavaScript経験者のためのGo言語入門
これからHTML5を書く人のためのセキュリティ - HTML5など勉強会
これからHTML5を書く人のためのセキュリティ - HTML5など勉強会
Mobylet20100613
Mobylet20100613
2008.10.18 L4u Tech Talk
2008.10.18 L4u Tech Talk
Groovy Bootcamp 2015 by JGGUG
Groovy Bootcamp 2015 by JGGUG
モバイル開発@symfony
モバイル開発@symfony
SlackのIncomingWebhooksとOutgoingWebhooksを使って電子工作と連携させてみよう
SlackのIncomingWebhooksとOutgoingWebhooksを使って電子工作と連携させてみよう
Jqm20120804 publish
Jqm20120804 publish
jQuery MobileとPhoneGapでスマートフォンアプリ楽々クッキング
jQuery MobileとPhoneGapでスマートフォンアプリ楽々クッキング
今からでも遅くないC#開発
今からでも遅くないC#開発
VSCodeで始めるAzure Static Web Apps開発
VSCodeで始めるAzure Static Web Apps開発
Tokyo GTUG Bootcamp2010
Tokyo GTUG Bootcamp2010
Plus de Ryota Murohoshi
【Unity】気づいたら加わっていたあいつ【もくもく】
【Unity】気づいたら加わっていたあいつ【もくもく】
Ryota Murohoshi
【ハピバ】未来に備えたKotlin、大好きだぜ!【Kotlin 1.0】
【ハピバ】未来に備えたKotlin、大好きだぜ!【Kotlin 1.0】
Ryota Murohoshi
「var禁止」禁止
「var禁止」禁止
Ryota Murohoshi
Javaのバージョニング問題の話しよっか
Javaのバージョニング問題の話しよっか
Ryota Murohoshi
LINQ、Select連弾ってやります?
LINQ、Select連弾ってやります?
Ryota Murohoshi
C#のList_TがIListを実装している件
C#のList_TがIListを実装している件
Ryota Murohoshi
どうしてこのコードエラーになるんですか?
どうしてこのコードエラーになるんですか?
Ryota Murohoshi
広告ネイティブプラグインの辛かった話しよっか
広告ネイティブプラグインの辛かった話しよっか
Ryota Murohoshi
UnityでC#を勉強しはじめた私の主張
UnityでC#を勉強しはじめた私の主張
Ryota Murohoshi
T4使ってみた
T4使ってみた
Ryota Murohoshi
UnityでのLINQ活用例
UnityでのLINQ活用例
Ryota Murohoshi
私とUnityとLINQと
私とUnityとLINQと
Ryota Murohoshi
「LINQ」っていう名前だけでも 覚えて帰ってください!
「LINQ」っていう名前だけでも 覚えて帰ってください!
Ryota Murohoshi
JXUGのLTだけれどもUnity+iOS+LINQの話をしようと思う!
JXUGのLTだけれどもUnity+iOS+LINQの話をしようと思う!
Ryota Murohoshi
RxJava初心者の私が良いと思ったやり方、素敵だと思った資料など
RxJava初心者の私が良いと思ったやり方、素敵だと思った資料など
Ryota Murohoshi
共変戻り値型って知ってますか?
共変戻り値型って知ってますか?
Ryota Murohoshi
Plus de Ryota Murohoshi
(16)
【Unity】気づいたら加わっていたあいつ【もくもく】
【Unity】気づいたら加わっていたあいつ【もくもく】
【ハピバ】未来に備えたKotlin、大好きだぜ!【Kotlin 1.0】
【ハピバ】未来に備えたKotlin、大好きだぜ!【Kotlin 1.0】
「var禁止」禁止
「var禁止」禁止
Javaのバージョニング問題の話しよっか
Javaのバージョニング問題の話しよっか
LINQ、Select連弾ってやります?
LINQ、Select連弾ってやります?
C#のList_TがIListを実装している件
C#のList_TがIListを実装している件
どうしてこのコードエラーになるんですか?
どうしてこのコードエラーになるんですか?
広告ネイティブプラグインの辛かった話しよっか
広告ネイティブプラグインの辛かった話しよっか
UnityでC#を勉強しはじめた私の主張
UnityでC#を勉強しはじめた私の主張
T4使ってみた
T4使ってみた
UnityでのLINQ活用例
UnityでのLINQ活用例
私とUnityとLINQと
私とUnityとLINQと
「LINQ」っていう名前だけでも 覚えて帰ってください!
「LINQ」っていう名前だけでも 覚えて帰ってください!
JXUGのLTだけれどもUnity+iOS+LINQの話をしようと思う!
JXUGのLTだけれどもUnity+iOS+LINQの話をしようと思う!
RxJava初心者の私が良いと思ったやり方、素敵だと思った資料など
RxJava初心者の私が良いと思ったやり方、素敵だと思った資料など
共変戻り値型って知ってますか?
共変戻り値型って知ってますか?
明日からちょっと 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
Télécharger maintenant