$30 off During Our Annual Pro Sale. View Details »

新言語KotlinでAndroidプログラミング #DroidKaigi

新言語KotlinでAndroidプログラミング #DroidKaigi

DroidKaigiでの発表で使用したスライドです。

Taro Nagasawa

April 25, 2015
Tweet

More Decks by Taro Nagasawa

Other Decks in Programming

Transcript

  1. ৽ݴޠ
    KotlinͰ
    Androidϓϩάϥϛϯά

    %SPJE,BJHJ
    !
    ೔ຊ,PUMJOϢʔβάϧʔϓ

    ௕ᖒଠ࿠!OHTX@UBSP
    ͜ͱΓΜ

    View Slide

  2. ࣗݾ঺հ

    View Slide

  3. ͸͡Ί·ͯ͠ʂ
    w ௕ᖒଠ࿠!OHTX@UBSP
    w ࢓ࣄͰ͸+BWB "OESPJEɺͱ͖Ͳ͖4DBMB
    w ࡀɺֈ࠲ɺͱ͕େ޷͖

    View Slide

  4. Θͨ͠ͱAndroid
    w ग़ձ͍͸೥ɻ)5"Ͱ༡ΜͰΈͨͷ͕࠷ॳ
    w ݸਓͰʮເͱຐ๏ͷ଴ͪ࣌ؒʯͱ͍͏ΞϓϦΛ։
    ൃɾެ։͍ͯ͠·͢ ສ%-

    w ॻ੶΍ٕज़ܥಉਓࢽͳͲʹܞΘΒ͍͍ͤͯͨͩͨ
    ܦݧ͕͋Γ·͢

    View Slide

  5. Θͨ͠ͱKotlin
    w ເதʹͳΓ࢝Ίͨͷ͸೥
    w Ҏདྷɺϒϩά΍ษڧձͰ৘ใൃ৴
    w 4PGUXBSF%FTJHO ٕධ
    Ͱ,PUMJOهࣄΛ࿈ࡌத

    View Slide

  6. ΋͘͡
    ,PUMJOͱ͸
    +BWBͱൺ΂Δ
    ,PUMJOͰ"OESPJEϓϩάϥϛϯά

    View Slide

  7. 1. Kotlinͱ͸

    View Slide

  8. ࣭໰
    Kotlinͱ͍͏ϓϩάϥϛϯάݴޠ
    Λฉ͍ͨ͜ͱ͕͋Γ·͔͢ʁ

    View Slide

  9. w !+BLF8IBSUPO͞Μ
    w ʮ6TJOH1SPKFDU,PUMJOGPS"OESPJEʯ
    w !LJSJNJO͞Μ
    w ʮ೥ͷ"OESPJE։ൃ͸,PUMJOͰܾ·Γ͔΋
    ͠Εͳ͍ʯ
    Androidք۾Ͱόζͬͨʁ

    View Slide

  10. Kotlinͱ͸

    View Slide

  11. Kotlinͱ͸
    Better Java

    View Slide

  12. w ೥Նʹ+FU#SBJOTʹΑΓൃද
    w Φʔϓϯιʔε "QBDIF-JDFOTF

    w +7.ݴޠɺBMU+4ɺ"OESPJE΋αϙʔτ
    w ੩తܕ෇͚ΦϒδΣΫτࢦ޲ݴޠ
    Kotlinͱ͸ (ৄ͘͠)

    View Slide

  13. ଞͷJVMݴޠͱͷҧ͍͸

    View Slide

  14. ଞͷJVMݴޠͱͷҧ͍͸
    ϚΠϧυ
    ݱ࣮ݟͯΔײ

    View Slide

  15. Kotlinͷಛ௃
    ؆୯
    ҆શ

    View Slide

  16. 2. Javaͱൺ΂Δ

    View Slide

  17. Hello World (Java)
    class HelloWorld {

    public static void main(String[] args) {

    System.out.println("Hello, world!");

    }

    }

    View Slide

  18. Hello World (Kotlin)
    fun main(args: Array) {

    println("Hello, world!")

    }

    View Slide

  19. Hello World (Kotlin)
    fun main(args: Array) {

    println("Hello, world!")

    }
    τοϓϨϕϧʹ
    ؔ਺Λஔ͚Δ
    ഑ྻʹ
    δΣωϦΫε
    ηϛίϩϯ
    ෆཁ

    View Slide

  20. ม਺ (Java)
    final int a = 0;

    View Slide

  21. ม਺ (Kotlin)
    val a = 0

    View Slide

  22. ม਺ (Kotlin)
    val a = 0
    ܕਪ࿦
    Մมͳม਺ʹ͸
    WBSΩʔϫʔυΛ

    View Slide

  23. Ϋϥε (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ͱ͔

    }

    View Slide

  24. Ϋϥε (Kotlin)
    class User(val id: Long, val name: String) {

    /
    / toString, equals, hashCodeͱ͔

    }

    View Slide

  25. Ϋϥε (Kotlin)
    class User(val id: Long, val name: String) {

    /
    / toString, equals, hashCodeͱ͔

    }
    ίϯετϥΫλҾ਺͕
    ͦͷ··ϓϩύςΟʹ

    View Slide

  26. dataΞϊςʔγϣϯ
    data class User(val id: Long, val name: String)

    View Slide

  27. σʔλΫϥε
    val taro = User(123, "Taro")

    println(taro.id) /
    / => 123

    println(taro.name) /
    / => Taro

    println(taro) /
    / => User(id=123, name=Taro)

    View Slide

  28. ؔ਺ܕΠϯλϑΣʔε (Java)
    /
    / anonymous class

    button.setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View v) {

    toast("Clicked!");

    }

    });

    !
    /
    / lambda

    button.setOnClickListener(v -> toast("Clicked!"));

    View Slide

  29. ؔ਺ܕΠϯλϑΣʔε (Kotlin)
    var count = 0

    button.setOnClickListener { toast("${count++}") }

    View Slide

  30. ؔ਺ܕΠϯλϑΣʔε (Kotlin)
    var count = 0

    button.setOnClickListener { toast("${count++}") }
    Ϋϩʔδϟ

    View Slide

  31. ߴ֊ؔ਺ͰίϨΫγϣϯૢ࡞
    (1..999)

    .filter { it % 3 == 0 || it % 5 == 0 }

    .reduce { a, b -> a + b }

    View Slide

  32. ߴ֊ؔ਺ͰίϨΫγϣϯૢ࡞
    (1..999)

    .filter { it % 3 == 0 || it % 5 == 0 }

    .reduce { a, b -> a + b }
    ʮΠϯϥΠϯؔ਺ʯ
    ؔ਺Ϧςϥϧ͕ల։͞Ε
    ΦϒδΣΫτΛੜ੒͠ͳ͍

    View Slide

  33. ಠࣗศརϝιου (Java)
    /
    / ఆٛ

    static void toast(Context c, String s) {...}

    !
    /
    / ݺͼग़͠

    MyUtils.toast(context, "Hello");

    View Slide

  34. ಠࣗศརϝιου (Kotlin)
    /
    / ఆٛ

    fun Context.toast(s: String) {...}

    !
    /
    / ݺͼग़͠

    context.toast("Hello")

    !
    /
    / ݺͼग़͠(ActivityͳͲͷத)

    toast("Hello")

    View Slide

  35. ಠࣗศརϝιου (Kotlin)
    /
    / ఆٛ

    fun Context.toast(s: String) {...}

    !
    /
    / ݺͼग़͠

    context.toast("Hello")

    !
    /
    / ݺͼग़͠(ActivityͳͲͷத)

    toast("Hello")
    ϝιουΛੜ΍ͤΔ
    ʮ֦ுؔ਺ʯ
    ੩తʹղܾ͞ΕΔʂ

    View Slide

  36. Optional (Java)
    String a = "hoge";

    Optional b = Optional.of("fuga");

    Optional c = null;

    View Slide

  37. Optional (Java)
    String a = "hoge";

    Optional b = Optional.of("fuga");

    Optional c = null;
    ΦϒδΣΫτੜ੒
    ୭ʹ΋OVMM͸ࢭΊΒΕͳ͍ʂ

    View Slide

  38. Optional (Kotlin)
    val a: String = "hoge"

    val b: String = null /
    / NG

    !
    val c: String? = "hoge"

    val d: String? = null /
    / OK

    !
    d.toUpperCase() /
    / NG

    View Slide

  39. 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

    View Slide

  40. 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
    OVMMͰͳ͍͜ͱ͕อূ͞Ε͍ͯΔ
    ৔ॴͰ͸/PU/VMMܕͱͯ͠ѻ͑Δ

    View Slide

  41. 3. KotlinͰ
    Androidϓϩάϥϛϯά

    View Slide

  42. Android StudioͰ࢖͏
    ී௨ʹϓϩδΣΫτΛ࡞੒
    +BWB,PUMJOม׵ Φϓγϣϯ

    CVJMEHSBEMFͷઃఆ
    ָ͍͠,PUMJOϥΠϑͷ࢝·Γʂ

    View Slide

  43. KotterKnife
    w,PUMJO൛#VUUFS,OJGF
    w࡞ऀ͸+BLF8IBSUPO͞Μ
    wಋೖ΍࢓૊Έղઆ͸ͪ͜ΒΛࢀর
    IUUQRJJUBDPNOHTX@UBSPJUFNTDEDEE

    View Slide

  44. KotterKnife ࢖༻લ
    var button: Button? = null

    !
    button = findViewById(R.id.button) as Button

    !
    button?.setOnClickListener {...}

    View Slide

  45. KotterKnife ࢖༻લ
    var button: Button? = null

    !
    button = findViewById(R.id.button) as Button

    !
    button?.setOnClickListener {...}
    "DUJWJUZͱ͔ͷϓϩύςΟ
    ຖ౓ͷpOE7JFX#Z*E
    ͦͯ͠Ωϟετʜ

    View Slide

  46. KotterKnife ࢖༻ޙ
    var button: Button by bindView(R.id.button)

    !
    button.setOnClickListener {...}

    View Slide

  47. KotterKnife ࢖༻ޙ
    var button: Button by bindView(R.id.button)

    !
    button.setOnClickListener {...}
    ϓϩύςΟ ಉ͡

    CZΩʔϫʔυʹଓ͚ͯ
    3JECVUUPOΛόΠϯυ
    pOE7JFX#Z*EෆཁͰ
    ී௨ʹ࢖͑ΔΑ͏ʹͳͬͯΔ

    View Slide

  48. Kotlin Android Extensions
    w"4 ͱ*OUFMMJ+*%&"
    ͷϓϥάΠϯ
    wpOE7JFX#Z*EΛۦஞ͢Δ΍ͭ
    wνϡʔτϦΞϧ͸ͪ͜ΒΛࢀর
    IUUQLPUMJOMBOHPSHEPDTUVUPSJBMTBOESPJEQMVHJOIUNM

    View Slide

  49. ࢖༻ྫ
    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 {...}

    View Slide

  50. Anko
    w͍ΖΜͳ%4-
    wओʹϨΠΞ΢τΛ૊Ή%4-
    wܕ҆શɺ؆ܿɾϦʔμϒϧɺ෦඼Խɾ
    ࠶ར༻ੑ
    wৄࡉ͸ͪ͜Β
    IUUQTHJUIVCDPN+FU#SBJOTBOLP

    View Slide

  51. View Slide

  52. ·ͱΊ
    w ,PUMJO͸ϓϩάϥϚʹ༏͍͠ʮݱ࣮ࢦ޲ʯݴޠ
    w "OESPJEͰ࢖͏ͱ޾ͤʹͳΕΔ͔΋

    View Slide

  53. ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠
    Let’s enjoy Kotlin!

    View Slide