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

Kotlin 最新動向2022 #tfcon #techfeed

Kotlin 最新動向2022 #tfcon #techfeed

https://techfeed.io/events/techfeed-conference-2022 で発表したスライドです。

Taro Nagasawa

May 14, 2022
Tweet

More Decks by Taro Nagasawa

Other Decks in Programming

Transcript

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  4. 簡潔・表現力
    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
    拡張プロパティ
    拡張関数
    演算子オーバロード

    View full-size slide

  5. 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
    と同じ

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  10. サーバーサイド
    Ktor
    Spring

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  17. 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);
    }

    View full-size slide

  18. 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ではコンパイルエラーに

    View full-size slide

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

    View full-size slide

  20. 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

    View full-size slide

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

    View full-size slide

  22. Thank you!
    Have a nice Kotlin!

    View full-size slide