Slide 1

Slide 1 text

+7.ݴޠͷ͔Θ͍͍ϧʔΩʔ Kotlinͷ঺հ %FW-07&ݱ৔ߕࢠԂ౦೔ຊେձ ճදٕτϥοΫ ! ೔ຊ,PUMJOϢʔβάϧʔϓ
 ௕ᖒଠ࿠

Slide 2

Slide 2 text

ΞδΣϯμ ࣗݾ঺հ ,PUMJOͱ͸ ,PUMJOͰ̋̋ ·ͱΊ

Slide 3

Slide 3 text

ࣗݾ঺հ

Slide 4

Slide 4 text

جຊ৘ใ w ௕ᖒଠ࿠!OHTX@UBSP w ιϑτ΢ΣΞΤϯδχΞ w ࣗশ,PUMJOΤόϯδΣϦετ w "OESPJE޷͖ͩΑ

Slide 5

Slide 5 text

΅͘ͱ,PUMJO ,PUMJOͱग़ձ͏ ղઆαΠτΛ্ཱͪ͛Δ ҰਓΞυϕϯτΧϨϯμʔʹ௅ઓ ೔ܦιϑτ΢ΤΞʹ,PUMJOهࣄΛدߘ ୈճ͔Θ͍͍,PUMJOษڧձΛ։࠵ ++6($$$Ͱ+7.ݴޠύωϧσΟεΧογϣϯ ΞυϕϯτΧϨϯμʔΛ࣮ࢪ ୈճ͔Θ͍͍,PUMJOษڧձΛ։࠵

Slide 6

Slide 6 text

,PUMJOͱ͸

Slide 7

Slide 7 text

,PUMJOͱ͸ w ϓϩάϥϛϯάݴޠ w +BWB7.্Ͱಈ͘+BWBόΠτίʔυʹί ϯύΠϧ͞ΕΔ w +FU#SBJOTΛத৺ʹ։ൃ͞Ε͍ͯΔ044 w ೥ʹൃදɺݱࡏWFS

Slide 8

Slide 8 text

ͳͥ,PUMJOͳͷ͔ w δϟό͸ͪΐͬͱʜ w 4DBMB͸ػೳ͕ଟͯ͘೉͍͠ w (SPPWZ͸ಈతͰ೉͍͠ w ͪΐ͏Ͳ͍͍ͱ͜Ζ͕ཉ͍͠ʂ

Slide 9

Slide 9 text

,PUMJO͕໨ࢦ͢ͱ͜Ζ w γϯϓϧ w ҆શ w ଎͍ ͬ͘͟Γݴ͏ͱ

Slide 10

Slide 10 text

,PUMJOͷಛ௃ w γϯϓϧ w ܕ҆શɺ/VMM҆શ w +7.Ͱಈ͘ w +BWB4DSJQUʹ΋ίϯύΠϧՄೳ w ੩తܕ෇͚ w ΦϒδΣΫτࢦ޲ w ؔ਺ܕϓϩάϥϛϯά

Slide 11

Slide 11 text

,PUMJOͰ̋̋

Slide 12

Slide 12 text

ͦͷ ,PUMJOͰ)FMMP8PSME

Slide 13

Slide 13 text

)FMMP8PSME package hello fun main(args : Array) { println("Hello, world!") }

Slide 14

Slide 14 text

)FMMP8PSME package hello fun main(args : Array) { println("Hello, world!") } ύοέʔδ௚Լʹ ؔ਺͕ஔ͚Δ ΤϯτϦϙΠϯτ͸ NBJOؔ਺

Slide 15

Slide 15 text

)FMMP8PSME package hello fun main(args : Array) { println("Hello, world!") } ม਺ͷܕ͕ޙஔ ഑ྻ͕ δΣωϦΫε

Slide 16

Slide 16 text

)FMMP8PSME package hello fun main(args : Array) { println("Hello, world!") } ηϛίϩϯ ෆཁ

Slide 17

Slide 17 text

ͦͷ ,PUMJOͰ'J[[#V[[

Slide 18

Slide 18 text

'J[[#V[[ for (i in 1..100) { val result = if (i % 15 == 0) "FizzBuzz" else if (i % 3 == 0) "Fizz" else if (i % 5 == 0) "Buzz" else i.toString() println(result) }

Slide 19

Slide 19 text

'J[[#V[[ for (i in 1..100) { val result = if (i % 15 == 0) "FizzBuzz" else if (i % 3 == 0) "Fizz" else if (i % 5 == 0) "Buzz" else i.toString() println(result) } +BWBͰ͍͏ͱ͜Ζͷ ֦ுGPSจͷΈ 3BOHF ΦϒδΣΫτ

Slide 20

Slide 20 text

'J[[#V[[ for (i in 1..100) { val result = if (i % 15 == 0) "FizzBuzz" else if (i % 3 == 0) "Fizz" else if (i % 5 == 0) "Buzz" else i.toString() println(result) } ܕਪ࿦ pOBM4USJOHSFTVMUʜ

Slide 21

Slide 21 text

'J[[#V[[ for (i in 1..100) { val result = if (i % 15 == 0) "FizzBuzz" else if (i % 3 == 0) "Fizz" else if (i % 5 == 0) "Buzz" else i.toString() println(result) } JGFMTF͸ࣜ ஋Λฦ͢

Slide 22

Slide 22 text

ͦͷ ,PUMJOͰؔ਺ܕϓϩάϥϛϯά

Slide 23

Slide 23 text

ؔ਺͕pSTUDMBTT val add = { (a: Int, b: Int) -> a + b } ! val add2 = add add2(3, 4) / / => 7

Slide 24

Slide 24 text

ؔ਺͕pSTUDMBTT val add = { (a: Int, b: Int) -> a + b } ! val add2 = add add2(3, 4) / / => 7 ؔ਺ϦςϥϧͰ ؔ਺Λੜ੒ͯ͠ ม਺ʹ୅ೖ ී௨ͷม਺ͷ Α͏ʹѻ͑Δ

Slide 25

Slide 25 text

ؔ਺͕pSTUDMBTT val add = { (a: Int, b: Int) -> a + b } ! val add2 = add add2(3, 4) / / => 7 ී௨ͷؔ਺ݺͼग़͠ ͷΑ͏ʹهड़Ͱ͖Δ

Slide 26

Slide 26 text

ߴ֊ؔ਺ val predicate = { (i: Int) -> i % 2 != 0 } list.filter(predicate)

Slide 27

Slide 27 text

ߴ֊ؔ਺ val predicate = { (i: Int) -> i % 2 != 0 } list.filter(predicate) Ҿ਺͕ح਺ͳΒ USVFͱͳΔड़ޠ ड़ޠͰ΋ͬͯ ϑΟϧλϦϯά

Slide 28

Slide 28 text

ؔ਺Ϧςϥϧ ϥϜμࣜ list.filter({ (i: Int) -> i % 2 != 0 })

Slide 29

Slide 29 text

ؔ਺Ϧςϥϧ ϥϜμࣜ list.filter { it % 2 != 0 } list.filter({ (i: Int) -> i % 2 != 0 })

Slide 30

Slide 30 text

ؔ਺Ϧςϥϧ ϥϜμࣜ list.filter { it % 2 != 0 } list.filter({ (i: Int) -> i % 2 != 0 }) ҉໧ͷม਺JU ܕ͸ਪ࿦͞ΕΔ

Slide 31

Slide 31 text

ίϨΫγϣϯܥϝιου pMUFSཁૉΛϑΟϧλ͢Δ DPVOU৚݅ʹ߹͏ཁૉͷ਺Λฦ͢ pOE৚݅ʹ߹͏࠷ॳͷཁૉΛฦ͢ NBQ֤ཁૉΛࣸͨ͠ίϨΫγϣϯΛฦ͢ qBU.BQNBQޙʹϑϥοτʹ͢Δ BMM͢΂ͯͷཁૉ͕৚݅ʹ߹͏ͳΒUSVF BOZ͍ͣΕ͔ͷཁૉ͕৚݅ʹ߹͏ͳΒUSVF GPMEશཁૉΛ૸ࠪͯͭ͠ͷ஋ʹ·ͱΊΔ

Slide 32

Slide 32 text

ΠϯϥΠϯؔ਺ val r = list.filter { it % 2 != 0 } inline fun filter(p: (T)->Boolean) { … }

Slide 33

Slide 33 text

ΠϯϥΠϯؔ਺ val r = list.filter { it % 2 != 0 } ྫ͑͹ val list_ = arrayListOf() for(e in list) if(e % 2 != 0) list_.add(e) val r = list_ ΠϯϥΠϯల։͞ΕΔ Φʔόϔου௿ݮ inline fun filter(p: (T)->Boolean) { … }

Slide 34

Slide 34 text

຤ඌݺग़͠࠷దԽ 5$0 tailRecursive fun sum(ints: List, s: Int = 0): Int = if(ints.none()) s else sum(ints.tail, s + ints.first()) UBJM3FDVSTJWFΞϊςʔγϣϯ ຤ඌͷ࠶ؼݺग़͠Λɺϧʔϓͱͯ͠ ίϯύΠϧͯ͘͠ΕΔ

Slide 35

Slide 35 text

ͦͷ ,PUMJOͰΦϒδΣΫτࢦ޲

Slide 36

Slide 36 text

Ϋϥε class Greeter ! val greeter = Greeter()

Slide 37

Slide 37 text

Ϋϥε class Greeter ! val greeter = Greeter() ࠷খͷ Ϋϥεఆٛ ΠϯελϯεԽ OFXෆཁ

Slide 38

Slide 38 text

ϝιου class Greeter { fun greet() { println("Hello") } }

Slide 39

Slide 39 text

ϝιου class Greeter { fun greet() { println("Hello") } } ݺͼग़͠ํ HSFFUFSHSFFU

Slide 40

Slide 40 text

ϓϩύςΟ class User(name: String) { var name: String = name } ! val user = User("Taro") user.name / / => "Taro"

Slide 41

Slide 41 text

ϓϩύςΟ class User(name: String) { var name: String = name } ! val user = User("Taro") user.name / / => "Taro" ίϯετϥΫλ ϓϩύςΟ

Slide 42

Slide 42 text

ϓϩύςΟ class User(name: String) { var name: String = name } ! val user = User("Taro") user.name / / => "Taro" ϑΟʔϧυʹ௚઀ ΞΫηε͍ͯ͠Δ෩

Slide 43

Slide 43 text

ΞΫηα class User(name: String) { var name: String = name set(name: String) {$name = name } get(): String = $name }

Slide 44

Slide 44 text

ΞΫηα class User(name: String) { var name: String = name set(name: String) {$name = name } get(): String = $name } ϓϩύςΟ໊ CBDLJOHpFME

Slide 45

Slide 45 text

%FMFHBUFE1SPQFSUZ class User(name: String) { val name: String by Decorator(name) } ! class Decorator(val str: String) { fun get(thisRef: Any, prop:PropertyMetadata): String = "˒$str˒" }

Slide 46

Slide 46 text

%FMFHBUFE1SPQFSUZ class User(name: String) { val name: String by Decorator(name) } ! class Decorator(val str: String) { fun get(thisRef: Any, prop:PropertyMetadata): String = "˒$str˒" } 6TFSOBNF΁ͷ ΞΫηε͕ҕৡ͞ΕΔ

Slide 47

Slide 47 text

ܧঝ open class Foo { fun foo(): String = "foo" } ! class Bar: Foo() ! Bar().foo() / / => foo

Slide 48

Slide 48 text

ܧঝ open class Foo { fun foo(): String = "foo" } ! class Bar: Foo() ! Bar().foo() / / => foo PQFOඞਢ σϑΥϧτͰ͸ܧঝෆՄ &⒎FDUJWF+BWB ߲໨ܧঝͷͨΊʹઃܭٴͼจॻԽ͢ΔɺͰͳ͚ Ε͹ܧঝΛېࢭ͢Δ

Slide 49

Slide 49 text

τϨΠτ trait A { fun hoge() = "A" fun fuga(): String } ! class Sample: A { override fun fuga() = "Sample" }

Slide 50

Slide 50 text

τϨΠτ trait Hoge { fun hoge() = "A" fun fuga(): String } ! class Sample: Hoge { override fun fuga() = "Sample" } GVHB ͸࣮૷ඞਢ PWFSSJEFΞϊςʔγϣϯ

Slide 51

Slide 51 text

τϨΠτ trait Hoge { fun hoge() = "A" fun fuga(): String } ! class Sample: Hoge { override fun fuga() = "Sample" } σϑΥϧτ࣮૷Λ ࣋ͯΔ

Slide 52

Slide 52 text

ଟॏܧঝ trait A { fun a() = "A" } trait B { fun a() = "B" } ! class C: A, B { override fun a() = super.a() }

Slide 53

Slide 53 text

ଟॏܧঝ trait A { fun a() = "A" } trait B { fun a() = "B" } ! class C: A, B { override fun a() = super.a() } ಉ໊͡લͷ࣮૷Λ ଟॏܧঝ ಉ໊͡લͷ࣮૷Λ ଟॏܧঝ

Slide 54

Slide 54 text

ҕৡ class Data(val value: String) ! trait Dao { fun save(data: Data) } ! class Service(dao: Dao): Dao by dao { fun createData(value: String) { val data = Data(value) save(data) } }

Slide 55

Slide 55 text

ҕৡ class Data(val value: String) ! trait Dao { fun save(data: Data) } ! class Service(dao: Dao): Dao by dao { fun createData(value: String) { val data = Data(value) save(data) } } ܕ͸ܧঝ͢Δʂ ࣮૷͸ҕৡ͢Δʂ

Slide 56

Slide 56 text

ͦͷ ,PUMJOͰ%4-

Slide 57

Slide 57 text

ͦͷ ,PUMJOͰ%4- %4-Ͱ࢖͑Δ ߏจ౶ҥͳͲ

Slide 58

Slide 58 text

தஔݺग़͠ JOpYDBMM "Kotlin".compareTo("Java") "Kotlin" compareTo "Java"

Slide 59

Slide 59 text

֦ுϝιου fun String.hello() { println("Hello, $this") } ! "World".hello()

Slide 60

Slide 60 text

֦ுϓϩύςΟ val String.upperCaseNum: Int get() = filter { it.isUpperCase() }.size ! "JavaCoffee".upperCaseNum / / => 2

Slide 61

Slide 61 text

ԋࢉࢠΦʔόϩʔυ class MyInt(val value: Int) { fun plus(that: MyInt): MyInt = MyInt(this.value + that.value) } ! MyInt(5) + MyInt(3) / / => MyInt(8)

Slide 62

Slide 62 text

Ԡ༻ྫ 5.hours - 42.minuts

Slide 63

Slide 63 text

Ԡ༻ྫ 5.hours - 42.minuts ֦ுϓϩύςΟ ֦ுϓϩύςΟ ԋࢉࢠ Φʔόϩʔυ

Slide 64

Slide 64 text

ͦͷ ,PUMJOͰ"OESPJEΞϓϦ

Slide 65

Slide 65 text

"OESPJE4UVEJPͰϓϩδΣΫτ࡞੒ TSDNBJOKBWBʹLUϑΝΠϧΛ࡞੒ ΫϦοΫˠ "OESPJE4UVEJP͕ࣗಈͰ͍Ζ͍Ζઃ ఆͯ͘͠ΕΔ "OESPJE4UVEJPͰ࢝ΊΔ "OESPJE4UVEJP ,PUMJO1MVHJO

Slide 66

Slide 66 text

,PUMJOͰ୯७ͳ"DUJWJUZ class MainActivity : Activity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) } }

Slide 67

Slide 67 text

ϏϡʔΛर͍͍ͬͯ͜ͱ͢Δ val button: Button? = findViewById(R.id.button) if (button != null) { button.setText("Click me") }

Slide 68

Slide 68 text

ϏϡʔΛर͍͍ͬͯ͜ͱ͢Δ val button: Button? = findViewById(R.id.button) if (button != null) { button.setText("Click me") } ܕ

Slide 69

Slide 69 text

/VMM҆શ val n: Int = null ,PUMJOͰ͸σϑΥϧτͰOVMMېࢭ ίϯύΠϧΤϥʔ

Slide 70

Slide 70 text

/VMM҆શ val n: Int? = null OVMMΛड͚औΔʹ͸ OVMMڐ༰ܕͰ͋Δ͜ͱΛ໌ࣔ͢Δ

Slide 71

Slide 71 text

/VMM҆શ val a: Int = null / / OK val b: Int? = null / / NG b.toString() / / NG if(b != null) b.toString() / / OK b?.toString() / / OK

Slide 72

Slide 72 text

/VMM҆શ val a: Int = null / / OK val b: Int? = null / / NG b.toString() / / NG if(b != null) b.toString() / / OK b?.toString() / / OK if (b != null) b.toString() else null

Slide 73

Slide 73 text

ϏϡʔΛर͍͍ͬͯ͜ͱ͢Δ val button: Button? = findViewById(R.id.button) ! button?.setText("Click me") / / if (button != null) { / / button.setText("Click me") / / }

Slide 74

Slide 74 text

4JOHMF"CTUSBDU.FUIPE button.setOnClickListener { Log.d(TAG, "Clicked") } button.setOnClickListener(object: OnClickListener { override fun onClick(v: View) { Log.d(TAG, "Clicked") } })

Slide 75

Slide 75 text

4JOHMF"CTUSBDU.FUIPE button.setOnClickListener { Log.d(TAG, "Clicked") } button.setOnClickListener(object: OnClickListener { override fun onClick(v: View) { Log.d(TAG, "Clicked") } }) PCKFDUࣜಗ໊Ϋϥε

Slide 76

Slide 76 text

4JOHMF"CTUSBDU.FUIPE button.setOnClickListener { Log.d(TAG, "Clicked") } button.setOnClickListener(object: OnClickListener { override fun onClick(v: View) { Log.d(TAG, "Clicked") } }) ந৅ϝιουͭͷΈ ؔ਺ϦςϥϧͰදهͰ͖Δ

Slide 77

Slide 77 text

7JFXͷ*OKFDUܥπʔϧ w "OESPJE"OOPUBUJPOTͳͲͷ"15 ,PUMJOͰ͸࢖͑ͳ͍ w 3PCP(VJDFͳͲͷϦϑϨΫγϣϯܥ ,PUMJOͰ΋࢖͑Δ

Slide 78

Slide 78 text

%FMFHBUFE1SPQFSUZ࠶ͼ class User(name: String) { val name: String by Decorator(name) } ! class Decorator(val str: String) { fun get(thisRef: Any, prop:PropertyMetadata): String = "˒$str˒" }

Slide 79

Slide 79 text

Ԡ༻ྫ7JFXͷ*OKFDU class MainActivity: Activity() { val submitButton: Button by injector() ! fun onCreate(savedInstanceState: Bundle?) { submitButton.setOnClickListener(::submit) } }

Slide 80

Slide 80 text

͓·͚ ,PUMJOͰ̋̋

Slide 81

Slide 81 text

,PUMJOͰ#%%ελΠϧͷςετ class TaxCalculatorSpecs: Spek() {{ ! given("Tax rate calculator with default locale settings") { val taxRateCalculator = TaxRateCalculator() on("calculating the rate for an income of 200 and an average change of 10 per semester") { val value = taxRateCalculator.calculateRate(200, 10) it("should result in a value of 300") { assertEquals(300, value) } } } }} ςετϑϨʔϜϫʔΫ! Spek http://jetbrains.github.io/spek/ΑΓҾ༻

Slide 82

Slide 82 text

,PUMJOͰ8FCΞϓϦ w ΋ͪΖΜී௨ͷαʔϒϨοτΛॻ͚Δ w 8BTBCJ4JOBUSBΠϯεύΠΞܥ w ,BSB)5.- $44΋,PUMJOͰ w /PEFLU/PEFKTͬΆ͍΍ͭ

Slide 83

Slide 83 text

,PUMJOͰ8FCΞϓϦ w ΋ͪΖΜී௨ͷαʔϒϨοτΛॻ͚Δ w 8BTBCJ4JOBUSBΠϯεύΠΞܥ w ,BSB)5.- $44΋,PUMJOͰ w /PEFLU/PEFKTͬΆ͍΍ͭ 8BTBCJҎ֎͸ ΄΅ߋ৽͞Εͯͳ͍

Slide 84

Slide 84 text

,PUMJOͰ+BWB4DSJQU w +BWB4DSJQU΁ͷίϯύΠϧՄೳ https://speakerdeck.com/ntaro/tian-xia- altjswu-dao-hui-kotlin-number- tenka1altjs ఱԼҰaltJS෢ಓձ Kotlin

Slide 85

Slide 85 text

͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠