2017_09_20_Java2Kotlin_IDOM

Daec7e5cd5fae384eda88037d937343b?s=47 AAkira
September 20, 2017
140

 2017_09_20_Java2Kotlin_IDOM

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

Daec7e5cd5fae384eda88037d937343b?s=128

AAkira

September 20, 2017
Tweet

Transcript

  1. Java to Kotlin lesson

  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
  3. $ whois IUUQTHPPHMX9UFI; IUUQTHPPHMQK$T IUUQTHPPHM"$K') なぜKotlin採用したか 少しだけ参加

  4. None
  5. 時間が無いので
 さらっとKotlin

  6. 準備 • 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 で呟いています
  7. Kotlinとは • JetBrains社が開発したJVM上で動く言語 • Javaとの完全互換 • 簡潔に生産性を高く書ける • Google I/O

    2017で正式採用 • Android, Server(Spring)がメインだが、iOS, JS向け もサポートしていく予定
  8. Agenda • val, var • Data class • if, when,

    for, while • Null • Extension • Lambda
  9. val, var • var : 可変変数定義 • val : 不変変数定義

    • 型推論可能な場合は省略可能 val hoge: Int = 0 hoge = 10 // compile error var hoge = 0 // ܕ͸লུՄೳ
  10. 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)
  11. 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 }
  12. 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
  13. 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 }
  14. 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 }
  15. ハンズオン
 Java -> Kotlin変換

  16. 準備 • 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 で呟いています
  17. 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
  18. Points • Lesson毎にKotlinに変換していきましょう • Branch • master branch -> Java

    • kotlin branch -> Kotlinで解答を書いています • Convert to Kotlinを有効に使って下さい
  19. How to convert

  20. Lesson1 • final -> val • 型推論 • 三項演算子 ->

    if-else
  21. Lesson2 • data class
 => PokemonDataクラスは1行になります
 => Default arguments •

    Property access 
 => foo.setBar(bar), getBar() • ${} で変数にアクセス可能
  22. Lesson3 • Javaのswitch, if-else文はwhenに置き換え可能 • fibonacciは普通に変換しても良いが、
 解答ではgenerateSequenceを用いて書いた

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

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

  25. Lesson6 • lambda式の変数はデフォルトだと `it`
 名前を付けることも出来る
 hoge { foo -> print(foo)

    } • 今まで使ったscope関数, when 等を使う