Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

自己紹介 ● 長澤 太郎(たろーって呼んでね) ● @ngsw_taro ● エムスリー株式会社 ● ディズニーが大好き! エムスリーは 国内最大規模の 医療情報プラット フォームを開発・ 運営しています。 エンジニア募 集中!

Slide 3

Slide 3 text

Kotlin Webアプリケーション 10/6発売! Kotlinイン・アクション 10/31発売!

Slide 4

Slide 4 text

Kotlin 1.2 RC リリース! ● マルチプラットフォーム・プロジェクト ● アノテーション引数における配列リテラル ● lateinitの改善 ● bound callable referenceの改善 ● 型推論の改善 ● スマートキャストの改善 ● その他ツールやライブラリの改善など

Slide 5

Slide 5 text

マルチプラットフォーム・プロジェクト ● マルチプラットフォームでのコードの共有を可能にする ● 例えば ○ ビジネスロジックやデータ構造などを共有 ■ 実装だけでなく宣言も共有することが可能 ○ ビューやデータアクセス、低レベル処理は各プラットフォーム固有 ● 現在はexperimental ● JVMとJSをサポート、Nativeはそのうち

Slide 6

Slide 6 text

マルチプラットフォーム・プロジェクトの構造 Common Platform (JVM) Platform (JS) Regular (JVM) Regular (JS) 矢印は 依存の方向

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

マルプラ・プロジェクト始め方

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

可変長引数と配列リテラル @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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

lateinitの改善(?) lateinit var log: Logger fun execute() { ... if (::log.isInitialized) { log.info("finished") } } nullableでよくない?

Slide 14

Slide 14 text

https://github.com/Kotlin/KEEP/blob/76493e794779dd5ba6db95069ac39ef5802005a1/proposals/lateinit-property-intrinsics.md#motivation

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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) }

Slide 17

Slide 17 text

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)

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

型推論の改善 // API level 26以降 fun findViewById(id: Int): T val btn1: Button = findViewById(R.id.btn1) OK val btn2 = findViewById(R.id.btn2) OK val btn3 = findViewbyId(R.id.btn3) as Button OK 1.2から、この推論がで きるようになった

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

スマートキャストの改善その1 fun main(args: Array) { val name: String? = null if (args.isNotEmpty()) name = args[0] run { if (name != null) name.length() } } 1.2より前: NG → 1.2: OK

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

スマートキャストの改善その2 val app = getApplication() val session = (app as? MyApp)?.login() if (session != null) { app.myAppMethod() } 1.2より前: NG → 1.2: OK

Slide 24

Slide 24 text

所感 ● 今回大きいのはマルチプラットフォーム対応っぽい ● 当初思った以上にKotlin/JSに力を入れているっぽい ● Kotlin/Nativeも(KotlinConfからも伺える) ● 割と本気で、サーバ・ブラウザ・モバイル・デスクトップでKotlin が活躍する日が来るのでは