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. 簡潔・表現力 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 拡張プロパティ 拡張関数 演算子オーバロード
  2. 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 と同じ
  3. Javaとの相互運用性 import java.util.UUID fun main(args: Array<String>) { val uuid =

    UUID.randomUUID() println(uuid) } KotlinからJavaを、JavaからKotlinを お互いに呼び出すことが容易 Javaの標準ライブラリはもちろん、 既存のJavaコードにKotlinから シームレスに参照可能
  4. fun main() { embeddedServer(Netty, port = 8080) { routing {

    get("{name}") { val name = call.parameters["name"] call.respondText("Hello, $name!") } } }.start(wait = true) }
  5. @Location("/{name}") class Hello(val name: String) fun main() { embeddedServer(Netty, port

    = 8080) { install(Locations) routing { get<Hello> { hello -> call.respondText("Hello, ${hello.name}") } } } }
  6. Spring x GraphQL: DGS Framework • Netflix社のGraphQLフレームワーク • アノテーションベース @DgsComponent

    class BookDataFetcher { @DgsQuery fun books(): List<Book> { ... } @DgsMutation fun createBook( @InputArgument input: CreateBookInput ): CreateBookPayload { ... } }
  7. 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ではコンパイルエラーに
  8. コンテキストレシーバー • Extension(拡張関数・拡張プロパティ)をさらに拡張したもの • 1個以上のレシーバーを「コンテキスト」として指定可能 • 関数やプロパティだけでなくクラスにも指定可能 • プロトタイプと呼ばれる、通常とは異なる実験状態 context(List<T>)

    fun <T> tail(): List<T> { return drop(1) } with(listOf(1, 2, 3)) { val got = tail() println(got) // [2, 3] } ※文法と動作を確認するための極めて単純な例 ※このユースケースでは、拡張関数・拡張プロパティの方が適している
  9. interface Monoid<T> { val unit: T fun T.combine(that: T): T

    } object IntMonoid: Monoid<Int> { override val unit: Int = 0 override fun Int.combine(that: Int): Int = this + that } context(Monoid<T>) fun <T> List<T>.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