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でAndroidが書きたくなる(かもしれない?)SAM変換と...
Search
RyotaMurohoshi
July 14, 2014
Technology
38
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
明日からちょっと KotlinでAndroidが書きたくなる(かもしれない?)SAM変換と拡張関数
2014/07/04 かわいいKotlin勉強会で行った発表の資料です
※ 元々はSlideShareで公開していた資料です。
RyotaMurohoshi
July 14, 2014
More Decks by RyotaMurohoshi
See All by RyotaMurohoshi
Tilemapのアップデートについて
ryotamurohoshi
0
96
Unityの合同同人誌や合同商業誌を書いてる僕は感想やレビューや評価が欲しい
ryotamurohoshi
0
630
Unity 2021.1での Unityパッケージの名称変更について
ryotamurohoshi
0
900
Odin Validationはいいぞ!
ryotamurohoshi
2
1.1k
Tilemapはいいぞ!2020 〜すごいぞ、プロジェクト専用拡張Brush〜
ryotamurohoshi
0
2.6k
Unityでも、新しいC#
ryotamurohoshi
0
1.5k
Riderはいいぞ!
ryotamurohoshi
1
3.8k
Riderのススメ〜俺はRiderここが好き〜
ryotamurohoshi
1
2.8k
Unity開発者に伝えたい.NETのこと
ryotamurohoshi
4
38k
Other Decks in Technology
See All in Technology
[DroidKaigi 2026] Making UI specifications visible: Android UI development in the AI agent era supported by Compose Screenshot Testing and galleries
syarihu
0
580
Guerilla InnerSource in enterprises, during the AI hype
onenashev
PRO
0
150
Lakebase ワークショップ / Lakebase-workshop
databricksjapan
PRO
0
100
AIで開発は速くなったのに、なぜ現場は楽にならないのか 〜あなたの組織のボトルネックを突き止めるワークショップ〜
jacopen
1
270
【視聴者参加型!】AWSセキュリティアンチパターンクイズ
syoshie
0
450
こんなアーキテクチャ図は嫌だ BEYOND THE TIME: 半年後の自分へ贈る15のメッセージ / 15 of Anti-pattern in AWS Architecture Diagrams
naospon
3
260
Genie Code ワークショップ 応用編 / Genie-Code-Workshop-advanced
databricksjapan
PRO
0
360
AI-DLCって実際どう? 〜聞きたいこと全部聞いてみる〜
news_it_enj
0
240
Driving AI Adoption Using In-House GPUs to Serve Qwen
po3rin
2
460
データエンジニアの困りごとをDevinと一緒に解消する
10xinc
2
840
推論の観測、できていますか? 〜 Google Cloud Gemini Enterprise Agent Platformで 3つの Gemini モデルを実測して踏んだ、評価の罠 〜
shukob
PRO
0
150
grill-me(grilling):AI駆動開発を超助けてくれるSkill / grill me
mathbullet
0
110
Featured
See All Featured
How STYLIGHT went responsive
nonsquared
100
6.3k
The Curse of the Amulet
leimatthew05
2
14k
[SF Ruby Conf 2025] Rails X
palkan
2
1.3k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.6k
The Language of Interfaces
destraynor
162
27k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Building a Scalable Design System with Sketch
lauravandoore
463
34k
Code Review Best Practice
trishagee
74
20k
Into the Great Unknown - MozCon
thekraken
41
2.7k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
エンジニアに許された特別な時間の終わり
watany
108
250k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
250
Transcript
໌͔Βͪΐͬͱ KotlinͰAndroid͕ॻ͖ͨ͘ͳΔ(͔͠Εͳ͍ʁ) SAMมͱ֦ுؔ ɹ ྄ࣨଠ 2014/7/4(ۚ))ୈ2ճ)͔Θ͍͍Kotlinษڧձ)#jkug
ಥવͰ͕࣭͢Ͱ͢ʂ
Kotlinॻ͍ͨ͜ͱ͋Δํʁ
ʮKotlin'ॻ͍ͨ͜ͱͳ͍ʯ ͬͯΠϕϯτϖʔδʹॻ͍͚ͨΕͲ ຊॻ͍ͨ͜ͱ͋Δํʁ
AndroidΞϓϦ ։ൃͨ͜͠ͱ͋Δํʁ
͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ
͓લͩΕΑ • ໊લ":"྄ࣨଠ • ࣄ":"AndroidΞϓϦ։ൃ(Java)ɺUnityήʔϜ։ൃ(C#) • Twi6er":"@RyotaMurohoshi • ߘઌ":"h6p:/ /qiita.com/RyotaMurohoshi
• ڵຯ":"Kotlin,"Groovy,"C#,"Unity,"SonyͷWearable"Device
AndroidΞϓϦΛJavaͰ։ൃ͍ͯͯ͠ɺ ʮͳΜͰ͜Μͳʹͳίʔυ͕ඞཁͳΜͩʂʯ ͬͯΠϥͬͱ͢Δ͜ͱ͋Γ·ͤΜ͔ʁ
ࢲ͋Γ·͢ʂ C#ΛۀͰ͍࢝ΊͨΓͨ͠Γɺ GroovyΛ΄Μͷͪΐͬͱษڧͨ͠Βɺ ʮͳΜͰJavaɺʓʓͰ͖ͳ͍ͷʔʂʯ ͬͯɺΠϥοͱͳΓ·ͨ͠
ͦ͜ͰKotlinͰ͢Ͷʂ
໌͔Βͪΐͬͱ KotlinͰAndroid͕ॻ͖ͨ͘ͳΔ(͔͠Εͳ͍ʁ) SAMมͱ֦ுؔ ͱͯ͠ࠓLT͠·͢ʂ
͍Βͬͱ͢Δͳίʔυ̍ button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) {
Log.v(TAG, "clicked"); } }); ͲΜͳAndroidೖॻʹࡌ͍ͬͯΔɺΞΫςΟϏςΟͰΑ͘ΈΔίʔυ KotlinͰॻ͍ͨͭͱൺΔͱɺͳͷ͕Ұྎવʂ
Kotlinͩͱ͖ͬ͢Γ button.setOnClickListener { Log.v(TAG, "clicked") }
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!"); } });
ߦ͕͘ͳͬͨ͜ͱͰͳ͘ɺ ʮͳ෦ॻ͘ඞཁ͕ͳ͘ ຊ࣭తͳ͜ͱ͚ͩॻ͚Α͘ͳͬͨʯ ͱ͍͏ͷ͕ϛι
JavaͷίʔυΛ͏ҰݟͯΈ·͠ΐ͏ button.setOnClickListener(new View.OnClickListener() { // newҎ߱ຊ࣭͡Όͳ͍ @Override // <- ຊ࣭͡Όͳ͍
public void onClick(View v) { // <- ຊ࣭͡Όͳ͍ Log.v(TAG, "clicked!"); } // <- ຊ࣭͡Όͳ͍ }); // <- ຊ࣭͡Όͳ͍ Javaຊ࣭͡Όͳ͍෦͕ଟ͍ɻKotlinຊ࣭ͷΈΛهड़͢Ε͍͍ Kotlinͳͥ͋Μͳهड़͕Ͱ͖Δͷ͔ʁ
Single'Abstract'Method'Conversions SAMม h"p:/ /blog.jetbrains.com/kotlin/2013/08/kotlin;m6;is;here/
SAM$ΠϯλʔϑΣʔε Ұͭͷ(Single))ந(Abstract))ϝιου(Method) ΛͭΠϯλʔϑΣʔε • Runnable):)void)run() • View.OnClickListener):)void)onClick(View)v) • Response.Listener<T>):)void)onResponse(T)response)) ͳͲɺଞʹͨ͘͞Μ
SAMม ؔϦςϥϧ!">!SAMΠϯλʔϑΣʔε!ͳม KotlinͰɺSAMΠϯλʔϑΣʔεΛҾʹͱΔϝιουͰɺ Ҿͷܕͱॱংͦͯ͠ฦܕ͕Ұக͢ΔؔϦςϥϧΛ͢ͱ ΠϯλʔϑΣʔεʹมͯ͘͠ΕΔ SAMΠϯλʔϑΣʔε͕ඞཁͳॴɺؔϦςϥϧͰεοΩϦʂ
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)
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 ҾʹؔϦςϥϧΛ͞ͳ͍ͱ͍͚ͳ͍
SAMมͰແବίʔυΛແͤ͘·͢Ͷʂ ͏Ұྫ VolleyͷStringRequest
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(); } } ); ແବͳ෦͕ଟ͘ɺॎʹ͍ɽɽɽ
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มՄೳ ໊લ͖ҾͰՄಡੑΞοϓ
ͪΐͬͱGroovyΈͯΈ·͠ΐ͏ GroovySAMม͕͑ΔΑ͏Ͱ͢ɻ 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
ͪΐͬͱ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
࣮AndroidStudioͱIntelliJͩͱ Ұ͚ͭͩϝιουΛ࣮ͨ͠ಗ໊Ϋϥε͕͍͍ײ͡ʹʂ(SAMܕ) button.setOnClickListener((v) -> {Log.v(TAG, "clicked");}); IDE্Ͱ͍͍ײ͡ͰંΓ·Εͯ·͕͢ɺ githubͱ͔ͰίʔυϦϏϡʔ͢Δͱ͖ɺ ΄Β·Εͳ͍͠ɽɽɽ h"p:/
/qiita.com/RyotaMurohoshi/items/0ce799c747d91756131a
Ҏ্ SAMมͰͨ͠ɻ
͍Βͬͱ͢Δͳίʔυ̎ ImageView imageView = (ImageView)findViewById(R.id.image_view); ͲΜͳAndroidೖॻʹࡌ͍ͬͯΔɺΞΫςΟϏςΟͰΑ͘ΈΔίʔυ ͚ΕͲʮImageViewʯͬͯͳΜͰ2ճॻ͘ඞཁ͋ΔΜʁܕਪͯ͘͠Ε͍͍ͯ͡ΌΜʂ
ͱΓ͋͑ͣܧঝ͠·͢ʁ 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);
͚Ͳܧঝͬͯ • ܧঝΉ͍ͣ • ʮܧঝ͕ڐ͞ΕΔͷখֶੜ·ͰͩΑͶʯɺͩͱɽɽɽ • Ac$vityͷαϒΫϥε͍͔ͭ͋͘Δ͚Ͳɺશ෦ʹߋʹαϒΫϥε ࡞ͬͯϝιουఆٛ͢Δʁ ͪΐͬͱͳ͍͔ͳɽɽɽ
ͯ͞Ͳ͏͠·͠ΐ͏ʁ • ͳهड़͕සൃͨ͠ΓɺΑ͘͏ॲཧ͕͋Δ • Ac$vityͱ͔ʹɺϝιουΛՃ͍ͨ͠ʂ • ͚Ͳܧঝͨ͘͠ͳ͍)or)Ͱ͖ͳ͍
Extension)Funcitons ֦ுؔ h"p:/ /confluence.jetbrains.com/display/Kotlin/Extension+func=ons
Extension)Funcitons(֦ுؔ)ͱ • ܧঝͤͣʹϝιουΛՃͰ͖Δ" • ܧঝېࢭͳΫϥεʹϝιουΛՃͰ͖Δ • privateͳϝϯόʹΞΫηεͰ͖ͳ͍ • ϝιουΛΦʔόʔϥΠυͰ͖ͳ͍
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
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) // <- } }
• fun$ClassName.methodName(hoge$:$Hoge)$:$Fuga"Έ͍ͨͳײ͡Ͱ ϝιουΛఆٛ͠·͢ • ఆ֦ٛͨ͠ுϝιουΛimport͠·͢ • ͦ͏͢Δͱී௨ͷϝιουͷΑ͏ʹ͑·͢ • ͜ͷྫͩͱAc+vityͷαϒΫϥε͚ͩͰͳ͘ɺ FragmentAc+vityɺAc+onBarAc+vityɺଞͷαϒΫϥεͰ͑
·͢(ܧঝͰఆٛ͢ΔͳΒɺ֤Ϋϥεʹϝιουఆ͕ٛඞཁ)
Extension)Func-onsΛ͑ɽɽɽ • ܧঝ͠ͳͯ͘ϝιουΛՃͰ͖·͢Ͷ • ͨ͘͞ΜͷΫϥεʹϝιουΛՃ͠ͳ͍͍ͯ͘Ͱ͢Ͷ • ࣗ࡞ͷϝιουͰͳهड़ΛεοΩϦͰ͖·͢Ͷʂ
ͪΐͬͱ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ͳϝιουͱ֦ͯ͠ுϝιουΛఆٛ͠·͢ɻ
ͪΐͬͱC#ΈͯΈ·͠ΐ͏ C# • JavaͷpackageΞΫηεͷΑ͏ͳɺϝϯόΛಉ໊͡લۭ͚ؒͩʹ ެ։͢Δͱ͍͏੍ݶ͕ͳ͍ • privateͰsta.cͳೖΕࢠͷΫϥε࡞ΕΔ • ͕↑ͳΫϥεͰ֦ுϝιουΛఆٛͰ͖ͳ͍ ͜ͷΫϥεʹ͚ͩɺ͜ͷ໊લۭؒͰ͚ͩ͑Δͱ͍͏֦ுϝιουΛఆٛͰ͖ͳ͍ʂ
ҰํKotlinͰ • packageʹͦͷ໊લۭؒͱͦͷαϒ໊લۭؒݶఆͰ • ΫϥεʹprivateΞΫηεϨϕϧͰ • ؔʹϩʔΧϧؔͱͯ͠ɺϩʔΧϧείʔϓͰ Kotlinͩͱ֦ுؔΛఆٛͰ͖Δʂ
Ҏ্ ֦ுؔͰͨ͠ɻ
࣭͋Γ·͔͢ʁ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ ɹ SAMมʹ͍ͭͯ(Qiita) h"p:/ /qiita.com/RyotaMurohoshi