Save 37% off PRO during our Black Friday Sale! »

Kotlin 1.2の予習 #Kotlin_Sansan

Kotlin 1.2の予習 #Kotlin_Sansan

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

14c9795d267f5b85abb98ca5e8780646?s=128

Taro Nagasawa

November 14, 2017
Tweet

Transcript

  1. Kotlin 1.2の予習 2017-11-09 Kotlin勉強会@Sansan 長澤太郎 @ngsw_taro

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

    エムスリーは 国内最大規模の 医療情報プラット フォームを開発・ 運営しています。 エンジニア募 集中!
  3. Kotlin Webアプリケーション 10/6発売! Kotlinイン・アクション 10/31発売!

  4. Kotlin 1.2 RC リリース! • マルチプラットフォーム・プロジェクト • アノテーション引数における配列リテラル • lateinitの改善

    • bound callable referenceの改善 • 型推論の改善 • スマートキャストの改善 • その他ツールやライブラリの改善など
  5. マルチプラットフォーム・プロジェクト • マルチプラットフォームでのコードの共有を可能にする • 例えば ◦ ビジネスロジックやデータ構造などを共有 ▪ 実装だけでなく宣言も共有することが可能 ◦

    ビューやデータアクセス、低レベル処理は各プラットフォーム固有 • 現在はexperimental • JVMとJSをサポート、Nativeはそのうち
  6. マルチプラットフォーム・プロジェクトの構造 Common Platform (JVM) Platform (JS) Regular (JVM) Regular (JS)

    矢印は 依存の方向
  7. 実装だけでなく宣言も共有可能 // Common module expect fun hello() // JVM module

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

    actual fun hello() { println("Hello, JVM!") } // JS module actual fun hello() { println("Hello, JS!") }
  9. マルプラ・プロジェクト始め方

  10. アノテーション引数における配列リテラル annotation class Foo(val value: Array<String>) @Foo(arrayOf("hoge", "fuga")) class Bar

    @Foo(["hoge", "fuga"]) class Bar
  11. 可変長引数と配列リテラル @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
  12. lateinitの改善(?) lateinit var log: Logger fun execute() { ... if

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

    (::log.isInitialized) { log.info("finished") } } nullableでよくない?
  14. https://github.com/Kotlin/KEEP/blob/76493e794779dd5ba6db95069ac39ef5802005a1/proposals/lateinit-property-intrinsics.md#motivation

  15. bound callabel referenceの改善 object Foo { fun square(n: Int) =

    n * n fun squareOf4() = (this::square)(4) fun squareOf5() = 5.let(this::square) }
  16. 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) }
  17. 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)
  18. 型推論の改善 // 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より前のバージョン
  19. 型推論の改善 // 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から、この推論がで きるようになった
  20. スマートキャストの改善その1 fun main(args: Array<String>) { val name: String? = null

    if (args.isNotEmpty()) name = args[0] run { if (name != null) name.length() } }
  21. スマートキャストの改善その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
  22. スマートキャストの改善その2 val app = getApplication() val session = (app as?

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

    MyApp)?.login() if (session != null) { app.myAppMethod() } 1.2より前: NG → 1.2: OK
  24. 所感 • 今回大きいのはマルチプラットフォーム対応っぽい • 当初思った以上にKotlin/JSに力を入れているっぽい • Kotlin/Nativeも(KotlinConfからも伺える) • 割と本気で、サーバ・ブラウザ・モバイル・デスクトップでKotlin が活躍する日が来るのでは