$30 off During Our Annual Pro Sale. View Details »

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 長澤 太郎

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

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

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

    UUID.randomUUID() println(uuid) } KotlinからJavaを、JavaからKotlinを お互いに呼び出すことが容易 Javaの標準ライブラリはもちろん、 既存のJavaコードにKotlinから シームレスに参照可能
  8. Google I/O 2017にて KotlinをAndroidの開発言語として 正式サポートすることを発表

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

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

    randomUUID(): String { /* 各プラットフォームに依存したコードで実装 */ }
  11. サーバーサイド Ktor Spring

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

    • 2022年4月ver2.0がリリースされた
  13. fun main() { embeddedServer(Netty, port = 8080) { routing {

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

    = 8080) { install(Locations) routing { get<Hello> { hello -> call.respondText("Hello, ${hello.name}") } } } }
  15. Spring Framework • Javaでお馴染みのWebアプリケーションフレームワーク • Kotlinを公式サポート @RestController class HelloController {

    @GetMapping fun hello(@RequestParam name: String): String { return "Hello, $name!" } }
  16. Spring x GraphQL: DGS Framework • Netflix社のGraphQLフレームワーク • アノテーションベース @DgsComponent

    class BookDataFetcher { @DgsQuery fun books(): List<Book> { ... } @DgsMutation fun createBook( @InputArgument input: CreateBookInput ): CreateBookPayload { ... } }
  17. Kotlin言語自体も成長中! 2021年11月 ver 1.6.0 2022年4月 ver 1.6.21最新安定版 2022年5月 ver 1.7.0-beta

  18. Definitely non-nullable types • 型パラメータに対してnullの非許容を明示する機能 • Javaで定義されたクラスやインタフェースの継承などに便利 • 1.6.20でbeta、1.7.0でstable interface

    KBox<T>: JBox<T> { override fun put(value: T & Any) } // Java interface JBox<T> { void put(@NotNull T value); }
  19. 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ではコンパイルエラーに
  20. コンテキストレシーバー • 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] } ※文法と動作を確認するための極めて単純な例 ※このユースケースでは、拡張関数・拡張プロパティの方が適している
  21. 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
  22. Duration APIが色々あってstableに import kotlin.time.Duration.Companion.* fun main() { val duration =

    5.hours + 30.minutes println(duration) // 5h 30m }
  23. Thank you! Have a nice Kotlin!