Slide 1

Slide 1 text

Java to Kotlin lesson

Slide 2

Slide 2 text

@_a_akira AAkira CyberAgent, Inc. Akira Aratani private lateinit var aakira : User data class User(val name: String, val twitterId: String, val githubId: String, val company: String) print("Name : ${aakira.name}”) println("Github Id : ${aakira.githubId}") print("Twitter Id : ${aakira.twitterId}") println("Company : ${aakira.company}") $ whois

Slide 3

Slide 3 text

$ whois IUUQTHPPHMX9UFI; IUUQTHPPHMQK$T IUUQTHPPHM"$K') なぜKotlin採用したか 少しだけ参加

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

時間が無いので
 さらっとKotlin

Slide 6

Slide 6 text

準備 • Android Studio 2.3以上
 最新の3.0-beta5でも可
 https://developer.android.com/studio/index.html • Emulator or 出来れば実機 
 で実行出来る環境が良いが無くても良い • このRepositoryをcloneして下さい
 https://github.com/AAkira/Java2KotlinPractice • 資料のリンクは @_a_akira で呟いています

Slide 7

Slide 7 text

Kotlinとは • JetBrains社が開発したJVM上で動く言語 • Javaとの完全互換 • 簡潔に生産性を高く書ける • Google I/O 2017で正式採用 • Android, Server(Spring)がメインだが、iOS, JS向け もサポートしていく予定

Slide 8

Slide 8 text

Agenda • val, var • Data class • if, when, for, while • Null • Extension • Lambda

Slide 9

Slide 9 text

val, var • var : 可変変数定義 • val : 不変変数定義 • 型推論可能な場合は省略可能 val hoge: Int = 0 hoge = 10 // compile error var hoge = 0 // ܕ͸লུՄೳ

Slide 10

Slide 10 text

Data class • getter, setterはプロパティアクセスで可能 • copy, toString, hasCode, equalsを自動生成 // Java class Hoge { private String foo; private int bar; Hoge(String foo, int bar) { ... } public String getFoo() { return foo; } ... } // Kotlin data class Hoge(var foo: String, var bar: Int)

Slide 11

Slide 11 text

if, when, for, while • if : Javaとほぼ同じ, 値を返せる => 三項演算子に置き換え可能 • when : switchの進化版(Kotlinにswitchはない) • for : for-eachのみ(Kotlinにfor(int i = 0; i <…)はない) • while : Javaと同じ // if 
 val hoge = if(foo > bar) 10 else 100 // when val hoge = when(foo) { 0 -> "a" 1 -> "b" else -> "c" } // for for (item in hogeList) { result += item }

Slide 12

Slide 12 text

Null • non-null : 通常の定義 • nullable : 型の後ろに『?』をつける • primitive型もnullableに出来る • 変数の後ろに?を付けるとnullの場合は何もしない val foo: String = 0 var bar: String? = null // if(foo != null) foo.lengthΛࣗಈͰ΍ͬͯ͘ΕΔ val hoge = foo?.length // ڧ੍తʹΞΫηε΋Մೳfoo͕nullͩͱψϧϙ val hoge = foo!!.length // elvisԋࢉࢠͰnullͩͬͨ࣌ͷॲཧ΋ॻ͚Δ val hoge = bar ?: 0

Slide 13

Slide 13 text

Extension : 拡張関数 • スコープ関数 (run, let, apply, also, with) • forEach()も拡張関数 • 自分で既存のクラスに定義することも可能 fun String.toInt(): Int = java.lang.Integer.parseInt(this) val hoge = "100".toInt() val hoge: String = “100" // run಺Ͱ͸this.***ͱ͍͏ҙຯ hoge.run { print(toInt()) // print 100 print(length) // print 3 }

Slide 14

Slide 14 text

Lambda • 値として扱える関数 • 高階関数の引数にもなる • lambda式の引数が1つの場合は『it』でアクセス可 • lambda式の引数が1つの場合は()を省略可能 // Java button2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { } } // Kotlin : SAMม׵ button.setOnClickListener { } // શ෦ಉ͡ҙຯ lambda.hoge({ foo: Int -> foo }) lambda.hoge() { foo: Int -> foo} lambda.hoge({ foo }) lambda.hoge() { foo } lambda.hoge { foo }

Slide 15

Slide 15 text

ハンズオン
 Java -> Kotlin変換

Slide 16

Slide 16 text

準備 • Android Studio 2.3以上
 最新の3.0-beta5でも可
 https://developer.android.com/studio/index.html • Emulator or 出来れば実機 
 で実行出来る環境が良いが無くても良い • このRepositoryをcloneして下さい
 https://github.com/AAkira/Java2KotlinPractice • 資料のリンクは @_a_akira で呟いています

Slide 17

Slide 17 text

Lesson Agenda • Lesson1 : val, var 3 min • Lesson2 : Data class  3 min • Lesson3 : if, when, for, while 5 min • Lesson4 : Null 7 min • Lesson5 : Extension 7 min • Lesson6 : Lambda 10 min

Slide 18

Slide 18 text

Points • Lesson毎にKotlinに変換していきましょう • Branch • master branch -> Java • kotlin branch -> Kotlinで解答を書いています • Convert to Kotlinを有効に使って下さい

Slide 19

Slide 19 text

How to convert

Slide 20

Slide 20 text

Lesson1 • final -> val • 型推論 • 三項演算子 -> if-else

Slide 21

Slide 21 text

Lesson2 • data class
 => PokemonDataクラスは1行になります
 => Default arguments • Property access 
 => foo.setBar(bar), getBar() • ${} で変数にアクセス可能

Slide 22

Slide 22 text

Lesson3 • Javaのswitch, if-else文はwhenに置き換え可能 • fibonacciは普通に変換しても良いが、
 解答ではgenerateSequenceを用いて書いた

Slide 23

Slide 23 text

Lesson4 • 複雑なのでPokemon, Itemは予めKotlin化済み • Primitive型の引数にもnullを渡せる • smart castを使ってnon-null型にする

Slide 24

Slide 24 text

Lesson5 • run, let, apply(scope関数)を使って書いてみる • 他にもalso, withがある(今回は使わなくても良い)

Slide 25

Slide 25 text

Lesson6 • lambda式の変数はデフォルトだと `it`
 名前を付けることも出来る
 hoge { foo -> print(foo) } • 今まで使ったscope関数, when 等を使う