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

Kotlin 1.2の予習 #Kotlin_Sansan

Kotlin 1.2の予習 #Kotlin_Sansan

Kotlin勉強会@Sansan #7 ( https://sansan.connpass.com/event/70543/ )で使用したスライドです。

Taro Nagasawa

November 14, 2017
Tweet

More Decks by Taro Nagasawa

Other Decks in Programming

Transcript

  1. 自己紹介 • 長澤 太郎(たろーって呼んでね) • @ngsw_taro • エムスリー株式会社 • ディズニーが大好き!

    エムスリーは 国内最大規模の 医療情報プラット フォームを開発・ 運営しています。 エンジニア募 集中!
  2. Kotlin 1.2 RC リリース! • マルチプラットフォーム・プロジェクト • アノテーション引数における配列リテラル • lateinitの改善

    • bound callable referenceの改善 • 型推論の改善 • スマートキャストの改善 • その他ツールやライブラリの改善など
  3. 実装だけでなく宣言も共有可能 // Common module expect fun hello() // JVM module

    actual fun hello() { println("Hello, JVM!") } // JS module actual fun hello() { println("Hello, JS!") }
  4. 実装だけでなく宣言も共有可能 // Common module expect fun hello() // JVM module

    actual fun hello() { println("Hello, JVM!") } // JS module actual fun hello() { println("Hello, JS!") }
  5. 可変長引数と配列リテラル @Bar(["hoge"]) annotation class Bar(vararg val value: String) @Bar(value =

    ["hoge"]) @Bar("hoge") @Bar(value = "hoge") @Bar(*["hoge"]) OK! Compilation error OK! OK! Deprecated
  6. lateinitの改善(?) lateinit var log: Logger fun execute() { ... if

    (::log.isInitialized) { log.info("finished") } }
  7. lateinitの改善(?) lateinit var log: Logger fun execute() { ... if

    (::log.isInitialized) { log.info("finished") } } nullableでよくない?
  8. bound callabel referenceの改善 object Foo { fun square(n: Int) =

    n * n fun squareOf4() = (this::square)(4) fun squareOf5() = 5.let(this::square) }
  9. bound callabel referenceの改善 object Foo { fun square(n: Int) =

    n * n fun squareOf4() = (this::square)(4) fun squareOf5() = 5.let(this::square) } object Foo { fun square(n: Int) = n * n fun squareOf4() = (::square)(4) fun squareOf5() = 5.let(::square) }
  10. bound callabel referenceの改善 object Foo { fun square(n: Int) =

    n * n fun squareOf4() = (this::square)(4) fun squareOf5() = 5.let(this::square) } object Foo { fun square(n: Int) = n * n fun squareOf4() = (::square)(4) fun squareOf5() = 5.let(::square) } ←コンンパイラが死ぬ (1.2.0-rc-39)
  11. 型推論の改善 // API level 26以降 fun <T: View> findViewById(id: Int):

    T val btn1: Button = findViewById(R.id.btn1) OK val btn2 = findViewById<Button>(R.id.btn2) OK val btn3 = findViewbyId(R.id.btn3) as Button NG 1.2より前のバージョン
  12. 型推論の改善 // API level 26以降 fun <T: View> findViewById(id: Int):

    T val btn1: Button = findViewById(R.id.btn1) OK val btn2 = findViewById<Button>(R.id.btn2) OK val btn3 = findViewbyId(R.id.btn3) as Button OK 1.2から、この推論がで きるようになった
  13. スマートキャストの改善その1 fun main(args: Array<String>) { val name: String? = null

    if (args.isNotEmpty()) name = args[0] run { if (name != null) name.length() } }
  14. スマートキャストの改善その1 fun main(args: Array<String>) { val name: String? = null

    if (args.isNotEmpty()) name = args[0] run { if (name != null) name.length() } } 1.2より前: NG → 1.2: OK
  15. スマートキャストの改善その2 val app = getApplication() val session = (app as?

    MyApp)?.login() if (session != null) { app.myAppMethod() }
  16. スマートキャストの改善その2 val app = getApplication() val session = (app as?

    MyApp)?.login() if (session != null) { app.myAppMethod() } 1.2より前: NG → 1.2: OK