Slide 1

Slide 1 text

ࠓ͔Β࢝ΊΔKotlinʹΑΔAndroidΞϓϦ։ൃ 2017.08.29 APP_DOJO @satorufujiwara

Slide 2

Slide 2 text

About me Satoru Fujiwara (@satorufujiwara) Android Engineer @CyberAgent ,Inc Shibuya.apk

Slide 3

Slide 3 text

Kotlin & Me FRESH! ΛKotlinͰ։ൃ (2015೥3݄ʙ) Kotlin Advent Calendar (2015/2016) -ʮ2016೥ɺKotlinͰAndroid։ൃ͢Δํ΁ʯ @Qiita ( goo.gl/0medax ) APP DOJO ʮKotlin in Google I/O 2017ʯ(2017/05/25) Kotlinೖ໳·Ͱͷॿ૸ಡຊ ( goo.gl/5vUT7o )

Slide 4

Slide 4 text

Kotlinೖ໳·Ͱͷॿ૸ಡຊ • ೔ຊKotlinϢʔβάϧʔϓͷ໊લͰ༗ࢤ 9໊Ͱࣥච • Google I/O 2017ͰKotlinͷΦϑΟγϟ ϧԽ͕ൃද͞Εͨޙɺ1िؒͰॻ͍ͨ • ແྉͰެ։ ( goo.gl/5vUT7o )

Slide 5

Slide 5 text

“ͱ͸ݴͬͯ΋ɺࠓճͷൃදͰ͸͡Ίͯ Kotlin ͱ͍͏ϓϩάϥϛ ϯάݴޠΛࣖʹͨ͠։ൃऀ΋ଟ͍͘Δ͜ͱͰ͠ΐ͏ɻ ʮKotlin ͱ͸Կͩ?ʯͱ͔ʮͳΜͰ Kotlinͳͷ͔?ʯͱ͔ʮͲ͏ ΍ֶͬͯ΂͹͍͍ͷ͔?ʯͱ͍͏ށ࿭͍΋͋Δ͔ͱࢥ͍·͢ɻ ͦ͜Ͱ… “ Kotlinೖ໳·Ͱͷॿ૸ಡຊɺલॻ͖ΑΓ

Slide 6

Slide 6 text

ຊ೔ͷGoal • ʮKotlin ͱ͸Կͩʁʯ • ʮͳΜͰ Kotlinͳͷ͔ʁʯ • ʮͲ͏΍ֶͬͯ΂͸ྑ͍ͷ͔ʁʯ

Slide 7

Slide 7 text

ຊ೔ͷGoal • ʮKotlin ͱ͸Կͩʁʯˠ Kotlinͷߟ͑ํʹ͍ͭͯ஌Δ • ʮͳΜͰ Kotlinͳͷ͔ʁʯˠ KotlinͷݴޠػೳΛ஌Δ • ʮͲ͏΍ֶͬͯ΂͸ྑ͍ͷ͔ʁʯˠ KotlinΛ࢝ΊΔͨΊͷπʔϧΛ஌Δ

Slide 8

Slide 8 text

Kotlinͷߟ͑ํ

Slide 9

Slide 9 text

Kotlin in Action • Kotlinͷ։ൃνʔϜʹΑͬͯॻ͔Εͨຊ • Kotlinͷίϯηϓτ͔ΒKotlinͷݴޠػೳΛجຊ ػೳ(if/when/ΫϥεͳͲ)͔Βൃలػೳ(nullable/ lambda/ߴ֊ؔ਺/૯শܕ)·ͰΧόʔ • ࠓ೔ͷϓϨθϯͷલ൒͸͜ͷຊͷ಺༰ʹ͔ͳΓԊͬ ͍ͯ·͢

Slide 10

Slide 10 text

Kotlin in Action • ຋༁ຊग़·͢ʂ • ༁ऀ • ௕ᖒଠ࿠ @ngsw_taro • ࢁຊ७ฏ @boohbah • yy_yank @yy_yank • ౻ݪ੟ @satorufujiwara

Slide 11

Slide 11 text

Kotlin ͕໨ࢦ͍ͯ͠Δͱ͜Ζ • ݱࡏ Java ͕࢖Θ͍ͯΔ؀ڥʹɺΑΓ؆ܿ ͰɺΑΓੜ࢈ੑ͕ߴ͘ɺΑΓ ҆શͳ Java ͷ୅ସݴޠΛఏڙ͢Δ͜ͱ • ݱঢ়ͩͱAndroidͱαʔόʔαΠυ • কདྷతʹ͸JavaScript؀ڥ΍ɺଞͷ؀ڥ(iOSͳͲ)ʹ΋ରԠ

Slide 12

Slide 12 text

Kotlin ͕໨ࢦ͍ͯ͠Δͱ͜Ζ • ݱࡏ Java ͕࢖Θ͍ͯΔ؀ڥʹɺΑΓ؆ܿ ͰɺΑΓੜ࢈ੑ͕ߴ͘ɺΑΓ ҆શͳ Java ͷ୅ସݴޠΛఏڙ͢Δ͜ͱ • ݱঢ়ͩͱAndroidͱαʔόʔαΠυ • কདྷతʹ͸JavaScript؀ڥ΍ɺଞͷ؀ڥ(iOSͳͲ)ʹ΋ରԠ

Slide 13

Slide 13 text

Kotlin ͷߟ͑ํ • ݱࡏJava͕࢖ΘΕ͍ͯΔ؀ڥͰɺΑΓੜ࢈ੑ͕ߴ͘ • ΑΓ؆ܿͰ • ΑΓ҆શͰ • Javaͷ୅ସݴޠ

Slide 14

Slide 14 text

Kotlin ͷߟ͑ํ • ݱࡏJava͕࢖ΘΕ͍ͯΔ؀ڥͰɺΑΓੜ࢈ੑ͕ߴ͘ → ࣮༻ओٛ • ΑΓ؆ܿͰ • ΑΓ҆શͰ • Javaͷ୅ସݴޠ

Slide 15

Slide 15 text

Kotlin ͷߟ͑ํ • ݱࡏJava͕࢖ΘΕ͍ͯΔ؀ڥͰɺΑΓੜ࢈ੑ͕ߴ͘ → ࣮༻ओٛ • ΑΓ؆ܿͰ → ؆ܿ • ΑΓ҆શͰ • Javaͷ୅ସݴޠ

Slide 16

Slide 16 text

Kotlin ͷߟ͑ํ • ݱࡏJava͕࢖ΘΕ͍ͯΔ؀ڥͰɺΑΓੜ࢈ੑ͕ߴ͘ → ࣮༻ओٛ • ΑΓ؆ܿͰ → ؆ܿ • ΑΓ҆શͰ → ҆શ • Javaͷ୅ସݴޠ

Slide 17

Slide 17 text

Kotlin ͷߟ͑ํ • ݱࡏJava͕࢖ΘΕ͍ͯΔ؀ڥͰɺΑΓੜ࢈ੑ͕ߴ͘ → ࣮༻ओٛ • ΑΓ؆ܿͰ → ؆ܿ • ΑΓ҆શͰ → ҆શ • Javaͷ୅ସݴޠ → ૬ޓӡ༻ੑ

Slide 18

Slide 18 text

Kotlin ͷߟ͑ํ • ࣮༻ओٛ • ؆ܿ • ҆શ • ૬ޓӡ༻ੑ

Slide 19

Slide 19 text

Kotlin ͷߟ͑ํ • ࣮༻ओٛ • ؆ܿ • ҆શ • ૬ޓӡ༻ੑ

Slide 20

Slide 20 text

Kotlin ͷ࣮༻ओٛ • Javaͷߟ͑ํ(ΦϒδΣΫτࢦ޲ͳͲ)͕جຊͦͷ··࢖͑Δ • ৽͍͠ػೳ(Lambda/Nullable etc)΋Ͳ͔͜Ͱฉ͍ͨ͜ͱ͋Δػೳ͹͔Γ • πʔϧ͕ॆ࣮͍ͯ͠Δ

Slide 21

Slide 21 text

Kotlin ͷ࣮༻ओٛ • Javaͷߟ͑ํ(ΦϒδΣΫτࢦ޲ͳͲ)͕جຊͦͷ··࢖͑Δ • ৽͍͠ػೳ(Lambda/Nullable etc)΋Ͳ͔͜Ͱฉ͍ͨ͜ͱ͋Δػೳ͹͔Γ • πʔϧ͕ॆ࣮͍ͯ͠Δ

Slide 22

Slide 22 text

data class Person(val name: String, val age: Int) fun findTheOldest(people: List): Person { var maxAge = 0 var theOldest: Person? = null for (person in people) { if (person.age > maxAge) { maxAge = person.age theOldest = person } } return theOldest }

Slide 23

Slide 23 text

data class Person(val name: String, val age: Int) fun findTheOldest(people: List): Person { var maxAge = 0 var theOldest: Person? = null for (person in people) { if (person.age > maxAge) { maxAge = person.age theOldest = person } } return theOldest } fun findTheOldest(people: List) = persons.maxBy { it.age }

Slide 24

Slide 24 text

Kotlin ͷ࣮༻ओٛ • Javaͷߟ͑ํ(ΦϒδΣΫτࢦ޲ͳͲ)͕جຊͦͷ··࢖͑Δ • Javaͷॻ͖ํ͕(ଟগҧ͏ͱ͜Ζ͸͋Δʹ͠Ζ)ͦͷ··࢖͑Δ • KotlinͰ௥Ճ͞Εͨؔ਺ܕϓϩάϥϛϯάͷܗͰ΋ॻ͚Δ • ͲͬͪͰॻ͔͘͸։ൃऀ࣍ୈ

Slide 25

Slide 25 text

Kotlin ͷؔ਺ܕϓϩάϥϛϯά • ؔ਺Λ஋ͱͯ͠ѻ͑Δ • ϥϜμࣜ • σʔλΫϥε(ෆมͳ஋) • ඪ४ϥΠϒϥϦ಺ͷ๛෋ͳAPI܈(֦ுؔ਺)

Slide 26

Slide 26 text

data class Person(val name: String, val age: Int) fun findTheOldest(people: List) = persons.maxBy{ it.age } σʔλΫϥε ϥϜμࣜ ؔ਺ ϥϜμ ΛҾ਺ʹऔΔ֦ுؔ਺ ෆม

Slide 27

Slide 27 text

Kotlin ͷ࣮༻ओٛ • Javaͷߟ͑ํ(ΦϒδΣΫτࢦ޲ɾ੩తܕ෇͚)͕جຊͦͷ··࢖͑Δ • ؔ਺ܕϓϩάϥϛϯάͰॻ͘ͱɺศརͳ৔໘(ίϨΫγϣϯͳͲ)͸ଟ͍ • ͲͬͪͰॻ͔͘͸ڧ੍͞Ε͓ͯΒͣ։ൃऀ࣍ୈ

Slide 28

Slide 28 text

Kotlin ͷߟ͑ํ • ࣮༻ओٛ • ؆ܿ • ҆શ • ૬ޓӡ༻ੑ

Slide 29

Slide 29 text

Kotlin ͷ؆ܿ͞ • ಡΈ΍͢͞Λॏࢹ • ϘΠϥϓϨʔτ(͓ܾ·Γͷίʔυ=ಡ·ͳͯ͘ྑ͍ίʔυ)ΛۃྗݮΒ͢ • Α͋͘Δػೳ͸ඪ४ϥΠϒϥϦͰఏڙ(લड़ͷmaxByͳͲ) • ಡΈʹ͘͘ͳΔ͜ͱ͸ͤ͞ͳ͍(ΧελϜԋࢉࢠͳͲ)

Slide 30

Slide 30 text

//Kotlin data class Person(val name: String, val age: Int)

Slide 31

Slide 31 text

//Java public final class Person { private final String name; private final int age; public Person(String name, int age) { this.name = name; this.age = age; } public final String getName() { return this.name; } public final int getAge() { return this.age; } public final Person copy(String name, int age) { return new Person(name, age); } public String toString() { return "Person(name=" + this.name + ", age=" + this.age + ")"; } public int hashCode() { return (this.name != null?this.name.hashCode():0) * 31 + this.age; } public boolean equals(Object var1) { //… } }

Slide 32

Slide 32 text

Data class ϘΠϥϓϨʔτ(͓ܾ·Γͷίʔυ=ಡ·ͳͯ͘ྑ͍ίʔυ)ΛۃྗݮΒ͢ • ίϯύΠϥͰͷϑΟʔϧυ΁ͷ୅ೖ • getter / setter → ʮϓϩύςΟʯͱ͍͏ߟ͑ํ • copy / toString / hasCode / equals ΛࣗಈͰੜ੒

Slide 33

Slide 33 text

Data class ΫϥεΛఆٛ͢Δ্Ͱͷؔ৺ࣄ͸ ʮϓϩύςΟͷܕ͕ԿͰɺ໊લ͕Կ͔ɺͦΕ͕Մม͔ෆม͔ʯ͚ͩ ͦΕҎ֎ͷϘΠϥʔϓϨʔτ͸ίϯύΠϥʹΑͬͯੜ੒͞ΕΔ data class Person(val name: String, val age: Int)

Slide 34

Slide 34 text

Kotlinͷ؆ܿ͞ ੩తܕ෇͚ݴޠͰ͋Γɺܕਪ࿦͕ಇ͘ var maxAge = 0 var maxAge : Int = 0

Slide 35

Slide 35 text

Kotlinͷ؆ܿ͞ ؔ਺ͷ໭Γ஋ͳͲ΋ܕਪ࿦͕ಇ͘ ؔ਺ͷදݱʹϥϜμ͕࢖͑Δ Α͋͘Δػೳ͸ඪ४ϥΠϒϥϦͰఏڙ fun findTheOldest(people: List) = persons.maxBy{ it.age } fun findTheOldest(people: List) : Person = persons.maxBy({ it.age })

Slide 36

Slide 36 text

Kotlin ͷߟ͑ํ • ࣮༻ओٛ • ؆ܿ • ҆શ • ૬ޓӡ༻ੑ

Slide 37

Slide 37 text

Kotlin ͷ҆શ͞ • ҆શੑΛߴΊΔ͜ͱͱ࣮૷ίετ͕ߴ͘ͳΔ͜ͱ͸ৗʹτϨʔυΦϑ • ΑΓ௿ίετͰߴ͍҆શੑΛ௥ٻ • ੩తܕ෇͚͸ͦͷ··ʹɺܕਪ࿦ʹΑΓίετΛԼ͍͛ͯΔ

Slide 38

Slide 38 text

Kotlin ͷ҆શ͞ • ҆શੑΛߴΊΔ͜ͱͱ࣮૷ίετ͕ߴ͘ͳΔ͜ͱ͸ৗʹτϨʔυΦϑ • ΑΓ௿ίετͰߴ͍҆શੑΛ௥ٻ • ੩తܕ෇͚͸ͦͷ··ʹɺܕਪ࿦ʹΑΓίετΛԼ͍͛ͯΔ • ॏཁͳ2ͭͷΤϥʔΛίετͷΑΓ͔͔Βͳ͍ํ๏Ͱ๷ࢭ • NullPointerException & ClassCastException

Slide 39

Slide 39 text

Null҆શ NullPointerException͕ϥϯλΠϜ࣌ʹى͜ΔͷΛ๷͙ Nullڐ༰ܕ(Nullable)ͱɺNullඇڐ༰ܕ(Non-Null)Λ۠ผ ௿ίετ(“?”Ұจࣈ)Ͱ࣮ݱ var theOldest: Person? = null var theOldest: Person = null //Error!

Slide 40

Slide 40 text

ClassͷΩϟετ Ұ౓ܕνΣοΫͨ͠ޙͷείʔϓ಺Ͱ͸ɺ࠶౓ͷΩϟετ͸ෆཁ ʮεϚʔτΩϟετʯͱݺ͹ΕΔ if(value is String) { println(value.toUpperCase()) }

Slide 41

Slide 41 text

Kotlin ͷߟ͑ํ • ࣮༻ओٛ • ؆ܿ • ҆શ • ૬ޓӡ༻ੑ

Slide 42

Slide 42 text

Kotlin ͷ૬ޓӡ༻ੑ • Kotlin͸JavaͷclassϑΝΠϧ΁ͱίϯύΠϧ͞ΕΔ • KotlinͱJavaͷιʔεΛࣗ༝ʹߦ͖དྷͰ͖Δ • JavaͷϥΠϒϥϦΛ࢖͑ΔɺJava͔ΒKotlinͷίʔυΛ࢖͑Δ • Kotlin͸JavaͷطଘͷΫϥε(List΍MapͳͲ)Λ࢖͍ͬͯΔ

Slide 43

Slide 43 text

Kotlin ͷߟ͑ํ • ࣮༻ओٛ - Javaͷߟ͑ํ͕ͦͷ··࢖͑Δɻ৽͍͠ػೳ͸طଘͷ΋ͷΛར ༻ɻֶश͕༰қɻ • ؆ܿ - ಡΈ΍͢͞ΛॏࢹɻϘΠϥʔϓϨʔτ͸ۃྗݮΒ͢ɻ • ҆શ - ੩తܕ෇͚ɻNull҆શɻεϚʔτΩϟετɻ • ૬ޓӡ༻ੑ - JavaͱKotlinͷؒ͸ࣗ༝ʹߦ͖དྷɻϥΠϒϥϦ΋طଘͷ΋ͷ Λͦͷ··ར༻Ͱ͖Δɻ

Slide 44

Slide 44 text

Kotlin ͷ஫ҙ఺ • Javaͷ୅ସݴޠͰ͋Γ࣮༻ओٛͰ͋ΔͷͰɺࣗ༝౓͕ߴ͍ • ؆ܿʹॻ͖͗͢ΔͱಡΈʹ͘͘ͳΔ͜ͱ΋ • νʔϜ಺ͳͲͰͷίʔσΟϯάϧʔϧ͸߹ͬͨ΄͏͕ྑͦ͞͏

Slide 45

Slide 45 text

Kotlinͷݴޠػೳ

Slide 46

Slide 46 text

Kotlin ͷݴޠػೳ • ม਺એݴ(val / var) & ܕਪ࿦ • Data classͱϓϩύςΟ • ੍ޚߏจ (if / when / for / when) • Nullڐ༰ܕ / Nullඇڐ༰ܕ • Lambda(ϥϜμ) • ඪ४ϥΠϒϥϦ & ֦ுؔ਺

Slide 47

Slide 47 text

Kotlin ͷݴޠػೳ • ม਺એݴ(val / var) & ܕਪ࿦ • Data classͱϓϩύςΟ • ੍ޚߏจ (if / when / for / when) • Nullڐ༰ܕ / Nullඇڐ༰ܕ • Lambda(ϥϜμ) • ඪ४ϥΠϒϥϦ & ֦ுؔ਺

Slide 48

Slide 48 text

ม਺એݴ(val / var) & ܕਪ࿦ ෆม(val) or Մม(var) Ͱ͋Δ͔Λࢦఆͯ͠ม਺Λએݴ ܕ͸ม਺ͷޙΖʹஔ͕͘ܕਪ࿦ग़དྷΔ৔߹͸লུՄೳ ෆม(val) ͸Javaͷfinalʹ૬౰͠ɺ࠶୅ೖͰ͖ͳ͍ Մม - mutable ,ෆม - immutable val answer = 42 var answer2 : Int = 42 answer = 4 //Error! answer2 = 4 //OK!

Slide 49

Slide 49 text

ม਺એݴ(val / var) & ܕਪ࿦ จ຺తʹҰ౓͔͠ॳظԽ͞Εͳ͍৔߹΋val͕࢖༻Ͱ͖Δ val message: String if (canPerformOperation()) { message = "Success" // ... perform the operation } else { message = "Failed" }

Slide 50

Slide 50 text

ม਺એݴ(val / var) & ܕਪ࿦ • Ͱ͖Δ͚ͩෆม(val) Λ࢖͍ɺඞཁͳ࣌ʹ͚ͩՄม(var)ʹ͢Δ • ActivityͷϑΟʔϧυͳͲɺvalʹ͠ਏ͍৔ॴ΋͋Γ·͕͢ɺ஗ԆॳظԽ (lazy)ͳͲΛ࢖͑͹ՄೳʹͳΔ৔໘΋͋Δ • ܕ͸໌ࣔͯ͠΋ܕਪ࿦ʹ·͔ͤͯ΋ྑ͍

Slide 51

Slide 51 text

Kotlin ͷݴޠػೳ • ม਺એݴ(val / var) & ܕਪ࿦ • Data classͱϓϩύςΟ • ੍ޚߏจ (if / when / for / when) • Nullڐ༰ܕ / Nullඇڐ༰ܕ • Lambda(ϥϜμ) • ඪ४ϥΠϒϥϦ & ֦ுؔ਺

Slide 52

Slide 52 text

Data class ίϯύΠϥͰͷϑΟʔϧυ΁ͷ୅ೖ getter / setter → ʮϓϩύςΟʯͱ͍͏ߟ͑ํ copy / toString / hasCode / equals ΛࣗಈͰੜ੒ data class Person(val name: String, var isMarried: Boolean)

Slide 53

Slide 53 text

௨ৗͷclass ίϯύΠϥͰͷϑΟʔϧυ΁ͷ୅ೖ getter / setter → ʮϓϩύςΟʯͱ͍͏ߟ͑ํ class Person(val name: String, var isMarried: Boolean)

Slide 54

Slide 54 text

௨ৗͷclass ίϯύΠϥͰͷϑΟʔϧυ΁ͷ୅ೖ getter / setter → ʮϓϩύςΟʯͱ͍͏ߟ͑ํ class Person(val name: String, var isMarried: Boolean)

Slide 55

Slide 55 text

//Kotlin data class Person(val name: String, var isMarried: Boolean) //Kotlin >>> val person = Person("Bob", true) >>> println(person.name) Bob >>> println(person.isMarried) true

Slide 56

Slide 56 text

//Kotlin data class Person(val name: String, var isMarried: Boolean) //Java >>> Person person = new Person("Bob", true); >>> System.out.println(person.getName()); Bob >>> System.out.println(person.isMarried()); true

Slide 57

Slide 57 text

//Kotlin data class Person(val name: String, var isMarried: Boolean) //Java >>> Person person = new Person("Bob", true); >>> System.out.println(person.getName()); Bob >>> System.out.println(person.isMarried()); true person.setName("Alice") //Error! person.setMarried(false) //OK!

Slide 58

Slide 58 text

//Kotlin data class Person(val name: String, var isMarried: Boolean) //Kotlin >>> val person = Person("Bob", true) >>> println(person.name) Bob >>> println(person.isMarried) true person.name = "Alice" //Error! person.isMarried = false //OK!

Slide 59

Slide 59 text

ϓϩύςΟ • JavaͷϑΟʔϧυͱΞΫηαϝιου(setter/getter)Λஔ͖׵͑Δ΋ͷ • val nameͱએݴ͢ΔͱKotlin͔Β͸nameɺJava͔Β͸getNameͱͯ͠ ݟ͑Δ • ܕ͕Booleanͷ৔߹͸ྫ֎ͱͯ͠isͰ࢝·Δؔ਺ʹͳΔ • varͰએݴ͢Ε͹setter͕͋ΓɺvalͰએݴͨ͠৔߹͸setter͕ͳ͍

Slide 60

Slide 60 text

Kotlin ͷݴޠػೳ • ม਺એݴ(val / var) & ܕਪ࿦ • Data classͱϓϩύςΟ • ੍ޚߏจ (if / when / for / while) • Nullڐ༰ܕ / Nullඇڐ༰ܕ • Lambda(ϥϜμ) • ඪ४ϥΠϒϥϦ & ֦ுؔ਺

Slide 61

Slide 61 text

੍ޚߏจ • if - Javaͱ΄΅ಉ͡ • when - JavaͷswitchΛڧྗʹͨ͠΋ͷ(Kotlinʹswitchจ͸ແ͍) • for - Javaͷfor-each(‘for (String item : list )’ͳͲ)͔͠ͳ͍ • while - Javaͱશ͘ಉ͡

Slide 62

Slide 62 text

ifจ KotlinͰ͸ifจΛࣜͱͯ͠ѻ͍ɺ஋Λฦ͢͜ͱ͕ग़དྷΔ Javaͷࡾ߲ԋࢉࢠ͸Kotlinʹ͸ແ͍ val larger = if(a > b) a else b

Slide 63

Slide 63 text

ifจ தׅހΛ࢖͏৔߹͸ɺͦͷதͷ࠷ޙͷจΛif͕ฦ͢஋ͱͯ͠ѻ͏ ifҎ֎ʹɺwhen΍try-catch΋ಉ༷ʹ஋Λฦࣜ͢ͱͯ͠ѻ͑Δ val result : String = if(isSuccess()){ // do something "Success" } else { "Failure" }

Slide 64

Slide 64 text

whenจ ڧྗͳswitchจ Javaͱҧ͍ɺϓϦϛςΟϒܕɺenumܕҎ֎ʹ΋࢖͑Δ fun getColorName(color: Color) = when (color) { Color.RED -> "Red" Color.ORANGE -> "Orange" Color.YELLOW -> "Yellow" else -> "Unknown" }

Slide 65

Slide 65 text

whenจ ৚݅ʹෳ਺ͷ߲໨ΛೖΕΔ͜ͱ͕Մೳ fun getWarmth(color: Color) = when (color) { RED, ORANGE, YELLOW -> "warm" GREEN -> "neutral" BLUE, INDIGO, VIOLET -> "cold" }

Slide 66

Slide 66 text

whenจ whenΛҾ਺ͳ͠Ͱ࢖͏͜ͱ΋ग़དྷΔ when { x.isOdd() -> print("x is odd") x.isEven() -> print("x is even") else -> print("x is funny") }

Slide 67

Slide 67 text

forจ inΛ࢖ͬͯɺJavaͷfor-eachจͷΑ͏ͳ܁Γฦ͠ॲཧ͕ग़དྷΔ Collection΍MapΛinͷޙΖʹஔ͘͜ͱ͕ग़དྷΔ for (item in collection) print(item) for (i in 1..100) { print(fizzBuzz(i)) }

Slide 68

Slide 68 text

forจ downTo΍stepΛ࢖ͬͯɺൣғΛࢦఆ͢Δ͜ͱ΋ग़དྷΔ for (i in 100 downTo 1 step 2) { print(fizzBuzz(i)) }

Slide 69

Slide 69 text

Kotlin ͷݴޠػೳ • ม਺એݴ(val / var) & ܕਪ࿦ • Data classͱϓϩύςΟ • ੍ޚߏจ (if / when / for / when) • Nullڐ༰ܕ / Nullඇڐ༰ܕ • Lambda(ϥϜμ) • ඪ४ϥΠϒϥϦ & ֦ுؔ਺

Slide 70

Slide 70 text

Nullڐ༰ܕ / Nullඇڐ༰ܕ Nullڐ༰ܕ(Nullable)ͱɺNullඇڐ༰ܕ(Non-Null)Λ۠ผ ௨ৗͷܕ͸Nullඇڐ༰ܕɺͦΕʹʹ?͕͍ͭͨ΋ͷ͕Nullڐ༰ܕ ϓϦϛςΟϒܕʹ΋nullڐ༰ܕ͕͋Δ var a: String = "" var b: String? = null var c: Int? = null

Slide 71

Slide 71 text

Nullඇڐ༰ܕ Nullඇڐ༰ܕ͸͜Ε·Ͱ௨ΓϓϩύςΟࢀরɺϝιουݺͼग़͕͠ग़དྷΔ Nullඇڐ༰ܕͷม਺ʹnullΛ୅ೖ͢ΔͱίϯύΠϧΤϥʔͱͳΔ fun strLength(str : String) = str.length strLength(null) // Error!

Slide 72

Slide 72 text

Nullڐ༰ܕ Nullڐ༰ܕ͸ϓϩύςΟࢀরɺϝιουݺͼग़͕͠ίϯύΠϧΤϥʔͱͳ Δ → ϓϩύςΟࢀরɺϝιουݺͼग़࣌͠͸ಛผͳํ๏͕ඞཁ Nullڐ༰ܕʹ͸nullΛ୅ೖ͢Δ͜ͱ͕ग़དྷΔ fun strLength(str : String?) = str.length //Error! strLength(null) //OK!

Slide 73

Slide 73 text

Nullڐ༰ܕ / Nullඇڐ༰ܕ • Ͱ͖Δ͚ͩNullඇڐ༰ܕ(Non-Null)Ͱఆٛ͢Δ • ඞཁͳ৔໘͚ͩʹNullڐ༰ܕ(Nullable)Λ࢖͏ • Nullڐ༰ܕ͸ಛผʹѻ͏ඞཁ͕͋Δ • Kotlin಺Ͱ͸ඞͣͲͪΒ͔ͷܕʹͳΔ͕ɺϓϥοτϑΥʔϜܕ(ܕ໊ͷޙΖʹ!)ͱ͍ ͏Java͔Β΍ͬͯ͘Δಛผͳܕ͕͋Δ • ίϯύΠϧޙ͸Javaͷ௨ৗͷܕͱಉ༷ʹѻΘΕΔͷͰϥϯλΠϜ࣌ͷΦʔόʔϔο υ͸ͳ͍

Slide 74

Slide 74 text

Nullڐ༰ܕ / Nullඇڐ༰ܕ • Ͱ͖Δ͚ͩNullඇڐ༰ܕ(Non-Null)Ͱఆٛ͢Δ • ඞཁͳ৔໘͚ͩʹNullڐ༰ܕ(Nullable)Λ࢖͏ • Nullڐ༰ܕ͸ಛผʹѻ͏ඞཁ͕͋Δ • Kotlin಺Ͱ͸ඞͣͲͪΒ͔ͷܕʹͳΔ͕ɺϓϥοτϑΥʔϜܕ(ܕ໊ͷޙΖʹ!)ͱ͍ ͏Java͔Β΍ͬͯ͘Δಛผͳܕ͕͋Δ • ίϯύΠϧޙ͸Javaͷ௨ৗͷܕͱಉ༷ʹѻΘΕΔͷͰϥϯλΠϜ࣌ͷΦʔόʔϔο υ͸ͳ͍

Slide 75

Slide 75 text

Nullඇڐ༰ܕͷѻ͍ํ • ifจʹΑΔnullνΣοΫ • ҆શݺͼग़͠ (?.) • ΤϧϏεԋࢉࢠ(?:) • ඇNullද໌(!!)

Slide 76

Slide 76 text

ifจʹΑΔnullνΣοΫ ifจͰҰ౓ɺnullͰͳ͍͜ͱΛνΣοΫ͢ΔͱnullʹͳΓಘͳ͍จ຺ͷதͰ ͸ɺNullඇڐ༰ܕͱͯ͠ѻ͑Δ ࢓૊Έతʹ͸εϚʔτΩϟετ fun strLength(str : String?) : Int = if (str != null) { str.length } else { 0 }

Slide 77

Slide 77 text

҆શݺͼग़͠(?.) Nullڐ༰ܕʹ?.Λ͚ͭΕ͹ɺϓϩύςΟ΍ϝιουΛ҆શʹݺͼग़ͤΔ ม਺͕nullͷ৔߹͸ݺͼग़͕࣮͠ߦ͞ΕͣɺnullΛฦ͢ νΣΠϯͤ͞Δ͜ͱ΋ग़དྷΔ fun strLength(str : String?) : Int? = str?.length >>> println(strLength("abc")) 3 >>> println(strLength(null)) null /VMMڐ༰ܕ

Slide 78

Slide 78 text

ΤϧϏεԋࢉࢠ(?:) ԋࢉࢠ(?:)ͷલ͕nullͳΒޙΖͷ஋Λฦ͢ ΤϧϏεɾϓϨεϦʔ໊͕લͷ༝དྷ fun strLength(str : String?) : Int = str?.length ?: 0 >>> println(strLength("abc")) 3 >>> println(strLength(null)) 0 /VMMඇڐ༰ܕ

Slide 79

Slide 79 text

ඇNullද໌(!!) Nullڐ༰ܕΛNullඇڐ༰ܕʹڧ੍తʹม׵͢Δ ΋͠null͕ೖͬͯͨ৔߹͸ϥϯλΠϜ࣌ʹNullPointerException͕౤͛ΒΕ Δ fun strLength(str : String?) : Int = str!!.length >>> println(strLength("abc")) 3 >>> println(strLength(null)) // NullPointerException /VMMඇڐ༰ܕ

Slide 80

Slide 80 text

Nullඇڐ༰ܕͷѻ͍ํ • ඇNullද໌(!!)͸ۃྗ࢖ΘͣʹɺԼͷ3ͭΛ৔໘ʹԠͯ͡࢖͍෼͚Δ • ifจʹΑΔnullνΣοΫ • ҆શݺͼग़͠ (?.) • ΤϧϏεԋࢉࢠ(?:) • ҆શݺͼग़͠ʹείʔϓؔ਺Λ૊Έ߹Θͤͯ࢖͏ํ๏΋͋Δ

Slide 81

Slide 81 text

είʔϓؔ਺ͱNullڐ༰ܕ είʔϓؔ਺ʹ͸ let / apply / with / run / also ͕͋Δ Nullඇڐ༰ܕΛҾ਺ʹͱΔؔ਺Λݺͼग़࣌͢ʹศར ϥϜμ(ޙड़)ͱ૊Έ߹Θͤͯ࢖͏ fun sendEmailTo(email: String) { /*...*/ } val email: String? = ... sendEmailTo(email) //Error! email?.let { sendEmailTo(it) } //OK! /VMMඇڐ༰ܕ

Slide 82

Slide 82 text

Kotlin ͷݴޠػೳ • ม਺એݴ(val / var) & ܕਪ࿦ • Data classͱϓϩύςΟ • ੍ޚߏจ (if / when / for / when) • Nullڐ༰ܕ / Nullඇڐ༰ܕ • Lambda(ϥϜμ) • ඪ४ϥΠϒϥϦ & ֦ுؔ਺

Slide 83

Slide 83 text

Lambda(ϥϜμ) ஋ͱͯ͠ѻ͑Δؔ਺ ߴ֊ؔ਺ͷҾ਺ʹͳΓಘΔ persons.maxBy { it.age } fun > Iterable.maxBy(selector: (T) -> R): T? Ҿ਺͕ؔ਺ܕ

Slide 84

Slide 84 text

LambdaͷҾ਺ͷলུ ϥϜμͷҾ਺Λলུͤͣʹॻ͘͜ͱ΋ग़དྷΔ it͸ϥϜμͷҾ਺͕1ͭͰɺҾ਺ͷఆٛΛলུͨ͠৔߹ʹͷΈ࢖͑Δ persons.maxBy { it.age } persons.maxBy { p:Person -> p.age }

Slide 85

Slide 85 text

LambdaΛҾ਺ʹऔΔ৔߹ͷ()ͷলུ ϥϜμ͕Ҿ਺ͷ࠷ޙʹ͋Δ৔߹ɺͦΕΛ()ͷ֎ʹग़͢͜ͱ͕ग़དྷΔ ϥϜμ͕།ҰͷҾ਺ͷ৔߹ɺ()Λলུ͢Δ͜ͱ͕ग़དྷΔ persons.maxBy { it.age } persons.maxBy(){ it.age } persons.maxBy({ it.age }) persons.maxBy(){ p:Person -> p.age } persons.maxBy({ p:Person -> p.age })

Slide 86

Slide 86 text

SAMม׵ ϥϜμ͸Javaͷಗ໊Ϋϥεͷ୅ΘΓʹ΋࢖͏͜ͱ͕ग़དྷΔ ͨͩͦ͠ͷΠϯλϑΣʔε͕1͔ͭ͠ந৅ϝιουΛ࣋ͨͳ͍৔߹ʹݶΔ SAMม׵(Single Abstract Method)ͱݺ͹ΕΔ //Java button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { /* actions on click */ } }); //Kotlin button.setOnClickListener { /* actions on click */ }

Slide 87

Slide 87 text

Kotlin ͷݴޠػೳ • ม਺એݴ(val / var) & ܕਪ࿦ • Data classͱϓϩύςΟ • ੍ޚߏจ (if / when / for / when) • Nullڐ༰ܕ / Nullඇڐ༰ܕ • Lambda(ϥϜμ) • ඪ४ϥΠϒϥϦ & ֦ுؔ਺

Slide 88

Slide 88 text

Kotlinͷඪ४ϥΠϒϥϦ είʔϓؔ਺΍ίϨΫγϣϯૢ࡞(maxBy΋ͦͷ1ͭ)ͳͲͷศརͳؔ਺܈͕ ఏڙ͞Ε͍ͯΔ αΠζ͕খ͍͞ͷͰAndroidͷapkʹؚΊͯ΋໰୊ͳ͍ ଟ͕֦͘ுؔ਺ fun > Iterable.maxBy(selector: (T) -> R): T?

Slide 89

Slide 89 text

֦ுؔ਺ Ϋϥε֎͔ΒΫϥεʹؔ਺Λ௥Ճ͢Δ͜ͱ͕ग़དྷΔ ֦ுͨ͠ΫϥεΛϨγʔόܕͱݺͿ fun String.toInt(): Int = java.lang.Integer.parseInt(this) val i = "120".toInt() ֦ுର৅ͷΫϥε UIJT͸֦ுͨ͠Ϋϥε ͷΦϒδΣΫτ

Slide 90

Slide 90 text

঺հͨ͠Kotlin ͷݴޠػೳ • ม਺એݴ(val / var) & ܕਪ࿦ • Data classͱϓϩύςΟ • ੍ޚߏจ (if / when / for / when) • Nullڐ༰ܕ / Nullඇڐ༰ܕ • Lambda(ϥϜμ) • ඪ४ϥΠϒϥϦ & ֦ுؔ਺

Slide 91

Slide 91 text

Kotlin ͷݴޠػೳ • Kotlinͷݴޠػೳ͸ɺଞʹ΋ͨ͘͞Μ͋Δ • Kotlin͸࣮༻ओٛͰɺ؆ܿͰɺ҆શͰɺJavaͱͷ૬ޓӡ༻ੑΛॏࢹͨ͠ ݴޠ • ·ͣ͸ɺ҆શੑ(Null҆શ)ʹҙࣝ͠ͳ͕Βॻ͖࢝Ίͯɺঃʑʹ༷ʑͳػ ೳΛ࢖͍࢝ΊΔͱྑ͍

Slide 92

Slide 92 text

Kotlinͷπʔϧ

Slide 93

Slide 93 text

Kotlin Λ࢝ΊΔͨΊͷπʔϧ • Android Studio • Convert Java to Kotlin

Slide 94

Slide 94 text

Android Studio • 3.0Ҏ߱ͰKotlinͷPlugin͕σϑΥϧτͰೖͬͨ • ͦΕҎલͷόʔδϣϯͰ΋PluginΛೖΕΔ͜ͱͰKotlinͰͷ։ൃ͕Մೳ

Slide 95

Slide 95 text

Android Studio 3.0 ϓϩδΣΫτ։࢝࣌ʹKotlinͰ࢝ΊΔ͜ͱ͕ग़དྷΔ

Slide 96

Slide 96 text

buid.gradle buildscript { ext.kotlin_version = '1.1.3-2' dependencies { classpath 'com.android.tools.build:gradle:3.0.0-beta3' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } app/build.gradle apply plugin: ‘kotlin-android' dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" }

Slide 97

Slide 97 text

Kotlin with Android Studio • Ͳͷબ୒ࢶͰ΋Մೳ • ϓϩδΣΫτ։࢝࣌ʹKotlin supportΛબͿ • Tools>Kotlin>Configure Kotlin in ProjectΛ࢖ͬͯKotlinϓϩδΣΫτԽ • खॻ͖ͰKotlinͷઃఆΛgradleʹ௥Ճ

Slide 98

Slide 98 text

Convert Java to Kotlin • JavaͷϑΝΠϧΛબ୒ͯ͠ʮCodeʯϝχϡʔ͔ ΒʮConvert Java File to Kotlin FileʯΛબͿ͜ͱ Ͱίʔυ͕Kotlinʹม׵͞ΕΔ • JavaͷίʔυΛKotlinͷϑΝΠϧ(.kt)΁ίϐϖ͢ Δ͜ͱͰ΋Kotlinʹม׵͞ΕΔ

Slide 99

Slide 99 text

Convert Java to Kotlin • Kotlinͷֶशʹศར • ͨͩ͠ɺྑ͍ίʔυͱ͸ݶΒͳ͍ͷͰཁ஫ҙ • ಛʹnull҆શʹ͸ؾΛ഑Δ

Slide 100

Slide 100 text

ຊ೔ͷGoal • ʮKotlin ͱ͸Կͩʁʯˠ Kotlinͷߟ͑ํʹ͍ͭͯ஌Δ • ʮͳΜͰ Kotlinͳͷ͔ʁʯˠ KotlinͷݴޠػೳΛ஌Δ • ʮͲ͏΍ֶͬͯ΂͸ྑ͍ͷ͔ʁʯˠ KotlinΛ࢝ΊΔͨΊͷπʔϧΛ஌Δ

Slide 101

Slide 101 text

·ͱΊ • Kotlin͸࣮༻ओٛͰɺ؆ܿͰ҆શͳɺJavaͱͷ૬ޓӡ༻ੑ͕ߴ͍ݴޠ • ্هΏ͑ʹॻ͖ํͷࣗ༝౓͕ߴ͍ݴޠ • ༷ʑͳػೳ͕༻ҙ͞Ε͍ͯΔͷ΋Kotlinͷಛ௃ • ·ͣ͸Null҆શΛҙࣝ͠ͳ͕Βॻ͖࢝ΊΔ • ಋೖ͢Δ৔߹͸νʔϜ಺Ͱͷٞ࿦͸ඞਢ(ֶशظؒઃ͚Δͷ΋ྑ͍)

Slide 102

Slide 102 text

How to start Kotlin • Official Site : kotl.in/ , kotl.in/android • Kotlin is awesome! (kotlin.link/) • Kotlin in Action • Kotlin ελʔτϒοΫ(੺΂͜ຊ) • Kotlin Advent Calendar (2015/2016) • Kotlinೖ໳·Ͱͷॿ૸ಡຊ( goo.gl/5vUT7o )

Slide 103

Slide 103 text

Thank you ! Let’s enjoy Kotlin