[back]

2024-02-26 11:52:49 +09:00

備忘録(Kotlin)

object class

なんか勝手にシングルトンになるらしい。わりと便利

sealed class

Rustでいう所のenum的な?代数的データ型らしい。非常に便利 whenで取り出すときはis SealedClass.SubClass -> { /*...*/ }で出せて、勝手に型も合わせておいてくれるらしい。めっちゃ便利 乱用したい

sealed classを定義する際にコンストラクタを一緒に定義しておくことで内部のdata classにもそのプロパティを継承させることができるっぽい。sealed class hoge(private val fuga: String)の内部にdata class piyo(): hoge(fuga = "1234")を作るみたいな感じで。IDとかの共通な部分はこれで定義しておくと何かと良さそうではある -> この共通部分はコンストラクタで作れない?っぽい。わからん 後で詳しく仕様読みたい

sealed classの入ったListから特定のdata classのみを選びたい場合はfilterIsInstance<T>()を使う。これ大好きかもしれん

when statement

switchとかmatchな感じの文?あとでhttps://qiita.com/yamadacsa/items/d3dc544da15f9ba52760読んでおく

when (val x = hogehoge()) { /*...*/ }とするとwhenブロックの中でのみ有効な一時変数を定義できる。スマートキャストが効かない場合にこうやって一時変数に代入してあげることでキャストできる。良いのかは知らん

vararg

可変長引数。fun sum(vararg i: int): intみたいな定義をするとiがなんか配列っぽい感じに扱えるっぽい?ぽいぽい スゲー便利そうだけど実際に実装する時に使うイメージは浮かばない Listを渡したかったら*演算子で展開してあげるといいらしい、面白……

let

パターンマッチではない Nullableな型に対して?.let { it -> /*...*/ }とすることでnullでない場合のみスコープ内の処理をやってくれるらしい。Optionとかのmap()に近い?

apply

インスタンスに対して.apply { /*...*/ }ってやるとインスタンスの設定とかできるっぽい?val a = hoge(); a.setStatus("fuga")みたいなのをval a = hoge().apply{ setStatus("fuga") }に圧縮できるみたいな……?スコープ関数わからん。でも便利

runCatching{}

runCatching { /* 失敗するかも処理 */ }
    .onSuccess { /* 成功時 */ }
    .onFailure { /* 失敗時 /* }

みたいな書き方でtry~catch構文的なエラーハンドリングが出来るらしい。まだ使ったことないけどResultに包むまでもない処理ならこれでよさそう

getOrNull()で例外握りつぶすこともできる。Option::ok()に近い感覚で使えそうで一気に便利度が増した

ジェネリクス

fun <T> hogehoge(fuga: T)みたいな構文? ジェネリクスの概念Rustで学んでしまった影響で構造体とかトレイトって単語が脳内をよぎるようになってしまったけど概ねKotlinも同じ使い方が出来そう。<T: hoge>とかwhere句で制約可

reified

ジェネリクスに<reified T>みたいにつけてあげると関数内でTの型を扱えるようになるらしい?ただし関数はinlineで定義されている必要がある

inline

コードの最適化がどうたら

分割代入

ない。現実は非情である

拡張関数

たとえばfun String.hoge() { /*...*/ }と書くとStringクラスに対してhogeメソッドが実装される。ひたすらに便利。他の言語にもこの仕様くれ

repeat(count) { /.../ }

for (index in 0 until count) { /*...*/ }と等価?記述量少なくて非常に便利そう