DroidKaigiでの発表で使用したスライドです。
৽ݴޠKotlinͰAndroidϓϩάϥϛϯά%SPJE,BJHJ!ຊ,PUMJOϢʔβάϧʔϓ ᖒଠ!OHTX@UBSP͜ͱΓΜ
View Slide
ࣗݾհ
͡Ί·ͯ͠ʂw ᖒଠ!OHTX@UBSPw ࣄͰ+BWB "OESPJEɺͱ͖Ͳ͖4DBMBw ࡀɺֈ࠲ɺͱ͕େ͖
Θͨ͠ͱAndroidw ग़ձ͍ɻ)5"Ͱ༡ΜͰΈͨͷ͕࠷ॳw ݸਓͰʮເͱຐ๏ͷͪ࣌ؒʯͱ͍͏ΞϓϦΛ։ൃɾެ։͍ͯ͠·͢ ສ%-w ॻ੶ٕज़ܥಉਓࢽͳͲʹܞΘΒ͍͍ͤͯͨͩͨܦݧ͕͋Γ·͢
Θͨ͠ͱKotlinw ເதʹͳΓ࢝Ίͨͷw ҎདྷɺϒϩάษڧձͰใൃ৴w 4PGUXBSF%FTJHO ٕධͰ,PUMJOهࣄΛ࿈ࡌத
͘͡,PUMJOͱ+BWBͱൺΔ,PUMJOͰ"OESPJEϓϩάϥϛϯά
1. Kotlinͱ
࣭Kotlinͱ͍͏ϓϩάϥϛϯάݴޠΛฉ͍ͨ͜ͱ͕͋Γ·͔͢ʁ
w !+BLF8IBSUPO͞Μw ʮ6TJOH1SPKFDU,PUMJOGPS"OESPJEʯw !LJSJNJO͞Μw ʮͷ"OESPJE։ൃ,PUMJOͰܾ·Γ͔͠Εͳ͍ʯAndroidք۾Ͱόζͬͨʁ
Kotlinͱ
KotlinͱBetter Java
w Նʹ+FU#SBJOTʹΑΓൃදw Φʔϓϯιʔε "QBDIF-JDFOTFw +7.ݴޠɺBMU+4ɺ"OESPJEαϙʔτw ੩తܕ͚ΦϒδΣΫτࢦݴޠKotlinͱ (ৄ͘͠)
ଞͷJVMݴޠͱͷҧ͍
ଞͷJVMݴޠͱͷҧ͍ϚΠϧυݱ࣮ݟͯΔײ
Kotlinͷಛ؆୯҆શ
2. JavaͱൺΔ
Hello World (Java)class HelloWorld { public static void main(String[] args) { System.out.println("Hello, world!"); } }
Hello World (Kotlin)fun main(args: Array) { println("Hello, world!") }
Hello World (Kotlin)fun main(args: Array) { println("Hello, world!") }τοϓϨϕϧʹؔΛஔ͚ΔྻʹδΣωϦΫεηϛίϩϯෆཁ
ม (Java)final int a = 0;
ม (Kotlin)val a = 0
ม (Kotlin)val a = 0ܕਪՄมͳมʹWBSΩʔϫʔυΛ
Ϋϥε (Java)class User { private final long id; private final String name; public User(long id, String name) { this.id = id; this.name = Objects.requireNonNull(name); } public long getId() { return id; } public String getName() { return name; } // toString, equals, hashCodeͱ͔ }
Ϋϥε (Kotlin)class User(val id: Long, val name: String) { // toString, equals, hashCodeͱ͔ }
Ϋϥε (Kotlin)class User(val id: Long, val name: String) { // toString, equals, hashCodeͱ͔ }ίϯετϥΫλҾ͕ͦͷ··ϓϩύςΟʹ
dataΞϊςʔγϣϯdata class User(val id: Long, val name: String)
σʔλΫϥεval taro = User(123, "Taro") println(taro.id) // => 123 println(taro.name) // => Taro println(taro) // => User(id=123, name=Taro)
ؔܕΠϯλϑΣʔε (Java)// anonymous class button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { toast("Clicked!"); } }); !// lambda button.setOnClickListener(v -> toast("Clicked!"));
ؔܕΠϯλϑΣʔε (Kotlin)var count = 0 button.setOnClickListener { toast("${count++}") }
ؔܕΠϯλϑΣʔε (Kotlin)var count = 0 button.setOnClickListener { toast("${count++}") }Ϋϩʔδϟ
ߴ֊ؔͰίϨΫγϣϯૢ࡞(1..999) .filter { it % 3 == 0 || it % 5 == 0 } .reduce { a, b -> a + b }
ߴ֊ؔͰίϨΫγϣϯૢ࡞(1..999) .filter { it % 3 == 0 || it % 5 == 0 } .reduce { a, b -> a + b }ʮΠϯϥΠϯؔʯؔϦςϥϧ͕ల։͞ΕΦϒδΣΫτΛੜ͠ͳ͍
ಠࣗศརϝιου (Java)// ఆٛ static void toast(Context c, String s) {...} !// ݺͼग़͠ MyUtils.toast(context, "Hello");
ಠࣗศརϝιου (Kotlin)// ఆٛ fun Context.toast(s: String) {...} !// ݺͼग़͠ context.toast("Hello") !// ݺͼग़͠(ActivityͳͲͷத) toast("Hello")
ಠࣗศརϝιου (Kotlin)// ఆٛ fun Context.toast(s: String) {...} !// ݺͼग़͠ context.toast("Hello") !// ݺͼग़͠(ActivityͳͲͷத) toast("Hello")ϝιουΛੜͤΔʮ֦ுؔʯ੩తʹղܾ͞ΕΔʂ
Optional (Java)String a = "hoge"; Optional b = Optional.of("fuga"); Optional c = null;
Optional (Java)String a = "hoge"; Optional b = Optional.of("fuga"); Optional c = null;ΦϒδΣΫτੜ୭ʹOVMMࢭΊΒΕͳ͍ʂ
Optional (Kotlin)val a: String = "hoge" val b: String = null // NG !val c: String? = "hoge" val d: String? = null // OK !d.toUpperCase() // NG
NULL҆શval a: String? = "hoge" val b: String? = null !if (a != null) a.toUpperCase() else null // => HOGE if (b != null) b.toUpperCase() else null // => null !a?.toUpperCase() // => HOGE b?.toUpperCase() // => null
NULL҆શval a: String? = "hoge" val b: String? = null !if (a != null) a.toUpperCase() else null // => HOGE if (b != null) b.toUpperCase() else null // => null !a?.toUpperCase() // => HOGE b?.toUpperCase() // => nullOVMMͰͳ͍͜ͱ͕อূ͞Ε͍ͯΔॴͰ/PU/VMMܕͱͯ͠ѻ͑Δ
3. KotlinͰAndroidϓϩάϥϛϯά
Android StudioͰ͏ී௨ʹϓϩδΣΫτΛ࡞+BWB,PUMJOม ΦϓγϣϯCVJMEHSBEMFͷઃఆָ͍͠,PUMJOϥΠϑͷ࢝·Γʂ
KotterKnifew,PUMJO൛#VUUFS,OJGFw࡞ऀ+BLF8IBSUPO͞ΜwಋೖΈղઆͪ͜ΒΛࢀরIUUQRJJUBDPNOHTX@UBSPJUFNTDEDEE
KotterKnife ༻લvar button: Button? = null !button = findViewById(R.id.button) as Button !button?.setOnClickListener {...}
KotterKnife ༻લvar button: Button? = null !button = findViewById(R.id.button) as Button !button?.setOnClickListener {...}"DUJWJUZͱ͔ͷϓϩύςΟຖͷpOE7JFX#Z*Eͦͯ͠Ωϟετʜ
KotterKnife ༻ޙvar button: Button by bindView(R.id.button) !button.setOnClickListener {...}
KotterKnife ༻ޙvar button: Button by bindView(R.id.button) !button.setOnClickListener {...}ϓϩύςΟ ಉ͡CZΩʔϫʔυʹଓ͚ͯ3JECVUUPOΛόΠϯυpOE7JFX#Z*EෆཁͰී௨ʹ͑ΔΑ͏ʹͳͬͯΔ
Kotlin Android Extensionsw"4 ͱ*OUFMMJ+*%&"ͷϓϥάΠϯwpOE7JFX#Z*EΛۦஞ͢ΔͭwνϡʔτϦΞϧͪ͜ΒΛࢀরIUUQLPUMJOMBOHPSHEPDTUVUPSJBMTBOESPJEQMVHJOIUNM
༻ྫimport kotlinx.android.synthetic.activity_main.button !public class MainActivity: Activity() { override fun onCreate(savedInstaceState: Bundle?) { super.onCreate(savedInstaceState) setContentView(R.layout.activity_main) button.setOnClickListener {...}
Ankow͍ΖΜͳ%4-wओʹϨΠΞτΛΉ%4-wܕ҆શɺ؆ܿɾϦʔμϒϧɺ෦Խɾ࠶ར༻ੑwৄࡉͪ͜ΒIUUQTHJUIVCDPN+FU#SBJOTBOLP
·ͱΊw ,PUMJOϓϩάϥϚʹ༏͍͠ʮݱ࣮ࢦʯݴޠw "OESPJEͰ͏ͱͤʹͳΕΔ͔
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠Let’s enjoy Kotlin!