Upgrade to Pro — share decks privately, control downloads, hide ads and more …

2017_09_20_Java2Kotlin_IDOM

AAkira
September 20, 2017
180

 2017_09_20_Java2Kotlin_IDOM

Java to Kotlin hands on
Github repository
https://github.com/AAkira/Java2KotlinPractice

AAkira

September 20, 2017
Tweet

More Decks by AAkira

Transcript

  1. Java to Kotlin lesson

    View full-size slide

  2. @_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

    View full-size slide

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

    View full-size slide

  4. 時間が無いので

    さらっとKotlin

    View full-size slide

  5. 準備
    • 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 で呟いています

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  9. 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)

    View full-size slide

  10. 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
    }

    View full-size slide

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

    View full-size slide

  12. 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
    }

    View full-size slide

  13. 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 }

    View full-size slide

  14. ハンズオン

    Java -> Kotlin変換

    View full-size slide

  15. 準備
    • 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 で呟いています

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  18. How to convert

    View full-size slide

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

    View full-size slide

  20. Lesson2
    • data class

    => PokemonDataクラスは1行になります

    => Default arguments
    • Property access 

    => foo.setBar(bar), getBar()
    • ${} で変数にアクセス可能

    View full-size slide

  21. Lesson3
    • Javaのswitch, if-else文はwhenに置き換え可能
    • fibonacciは普通に変換しても良いが、

    解答ではgenerateSequenceを用いて書いた

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  24. Lesson6
    • lambda式の変数はデフォルトだと `it`

    名前を付けることも出来る

    hoge { foo -> print(foo) }
    • 今まで使ったscope関数, when 等を使う

    View full-size slide