Slide 1

Slide 1 text

最新動向 2022 2022-05-14 長澤 太郎

Slide 2

Slide 2 text

長澤 太郎 @ngsw_taro Ubie株式会社 Ubie Discoveryに所属するプログラマー。 日々、世界の医療に貢献すべくコードを紡ぐ男。 プログラミング言語 Kotlinを愛し、自らエバンジェリストを名乗って講演や執筆な どの活動を行う。ビールとラーメンが好き。一児の父。

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

プログラミング言語 Kotlin ● 2011年にJetBrainsにより発表 ● 静的型付けオブジェクト指向言語 ● いわゆるJVM言語のひとつ ● 2016年にver1.0がリリース

Slide 5

Slide 5 text

簡潔・表現力 import java.time.Duration val Int.hours: Duration get() = Duration.ofHours(toLong()) operator fun Duration.plus(that: Duration): Duration { return plus(that) } 15.hours + 9.hours == Duration.ofDays(1) //=> true 拡張プロパティ 拡張関数 演算子オーバロード

Slide 6

Slide 6 text

NULL安全 val a: Int = null // コンパイルエラー val b: Int? = null // OK b.length // コンパイルエラー nullの可能性のあるものと、そうでないものを厳格に 区別することでケアレスミスを防ぐ if (b != null) { b.length } b?.length nullでないことが 確実な文脈 if (b != null) b.length else null と同じ

Slide 7

Slide 7 text

Javaとの相互運用性 import java.util.UUID fun main(args: Array) { val uuid = UUID.randomUUID() println(uuid) } KotlinからJavaを、JavaからKotlinを お互いに呼び出すことが容易 Javaの標準ライブラリはもちろん、 既存のJavaコードにKotlinから シームレスに参照可能

Slide 8

Slide 8 text

Google I/O 2017にて KotlinをAndroidの開発言語として 正式サポートすることを発表

Slide 9

Slide 9 text

元々Javaの代替として登場したが、 今やJavaScript, Nativeをもターゲットに含めた マルチプラットフォーム言語を目指すまでに 引用 https://kotlinlang.org/docs/multiplatform.html

Slide 10

Slide 10 text

ビジネスロジックなどで、Kotlinコードを共有 プラットフォーム固有のUIなどは、それぞれ実装 引用 https://kotlinlang.org/docs/multiplatform-connect-to-apis.html expect fun randomUUID(): String actual fun randomUUID(): String { /* 各プラットフォームに依存したコードで実装 */ }

Slide 11

Slide 11 text

サーバーサイド Ktor Spring

Slide 12

Slide 12 text

Ktor • ネットワークプログラミング用クライアントライブラリ /サーバサイドフレームワーク • Kotlinと、そのコルーチン機能が活用されている • 軽量かつフレキシブル • JetBrainsやKotlinコミュニティにサポートされている • 2022年4月ver2.0がリリースされた

Slide 13

Slide 13 text

fun main() { embeddedServer(Netty, port = 8080) { routing { get("{name}") { val name = call.parameters["name"] call.respondText("Hello, $name!") } } }.start(wait = true) }

Slide 14

Slide 14 text

@Location("/{name}") class Hello(val name: String) fun main() { embeddedServer(Netty, port = 8080) { install(Locations) routing { get { hello -> call.respondText("Hello, ${hello.name}") } } } }

Slide 15

Slide 15 text

Spring Framework • Javaでお馴染みのWebアプリケーションフレームワーク • Kotlinを公式サポート @RestController class HelloController { @GetMapping fun hello(@RequestParam name: String): String { return "Hello, $name!" } }

Slide 16

Slide 16 text

Spring x GraphQL: DGS Framework • Netflix社のGraphQLフレームワーク • アノテーションベース @DgsComponent class BookDataFetcher { @DgsQuery fun books(): List { ... } @DgsMutation fun createBook( @InputArgument input: CreateBookInput ): CreateBookPayload { ... } }

Slide 17

Slide 17 text

Kotlin言語自体も成長中! 2021年11月 ver 1.6.0 2022年4月 ver 1.6.21最新安定版 2022年5月 ver 1.7.0-beta

Slide 18

Slide 18 text

Definitely non-nullable types • 型パラメータに対してnullの非許容を明示する機能 • Javaで定義されたクラスやインタフェースの継承などに便利 • 1.6.20でbeta、1.7.0でstable interface KBox: JBox { override fun put(value: T & Any) } // Java interface JBox { void put(@NotNull T value); }

Slide 19

Slide 19 text

whenの網羅性の強化 enum class Color { CYAN, MAGENTA, YELLOW } when(color) { Color.CYAN -> println("シアン") Color.MAGENTA -> println("マゼンタ") } when式において、Boolean / enum / sealedの要素が 網羅されていないとコンパイルエラー(以前から) when文において、Boolean / enum / sealedの要素が 網羅されていないとコンパイル時に警告 そして、ver1.7ではコンパイルエラーに

Slide 20

Slide 20 text

コンテキストレシーバー • Extension(拡張関数・拡張プロパティ)をさらに拡張したもの • 1個以上のレシーバーを「コンテキスト」として指定可能 • 関数やプロパティだけでなくクラスにも指定可能 • プロトタイプと呼ばれる、通常とは異なる実験状態 context(List) fun tail(): List { return drop(1) } with(listOf(1, 2, 3)) { val got = tail() println(got) // [2, 3] } ※文法と動作を確認するための極めて単純な例 ※このユースケースでは、拡張関数・拡張プロパティの方が適している

Slide 21

Slide 21 text

interface Monoid { val unit: T fun T.combine(that: T): T } object IntMonoid: Monoid { override val unit: Int = 0 override fun Int.combine(that: Int): Int = this + that } context(Monoid) fun List.sum(): T = fold(unit) { acc, e -> acc.combine(e) } with(IntMonoid) { val sum = listOf(1, 2, 3).sum() println(sum) // 6 } 参考 https://github.com/Kotlin/KEEP/blob/context-receivers/proposals/context-receivers.md#use-cases

Slide 22

Slide 22 text

Duration APIが色々あってstableに import kotlin.time.Duration.Companion.* fun main() { val duration = 5.hours + 30.minutes println(duration) // 5h 30m }

Slide 23

Slide 23 text

Thank you! Have a nice Kotlin!