KotlinのMapにwithDefaultというメソッドが生えているらしい。
On a map, use 'withDefault' to get a wrapper that obtains a default value when using 'getValue' on a key that is not present. Note that this does not change the behavior of the indexed access operator x[idx] / x.get(idx)! https://t.co/kldivSn4mI #KotlinTips pic.twitter.com/VM20ZtrWbi
— Kotlin (@kotlin) June 2, 2020
試してみた。
val fruits = mapOf(
"イチゴ" to "🍓",
"バナナ" to "🍌",
"ミカン" to "🍊"
).withDefault {
"❓"
}
val s = fruits.getValue("イチゴ") // 🍓
val p = fruits.getValue("パイナップル") // ❓
val r = fruits["ラズベリー"] // null
ツイートの通りの結果になった。
デフォルト値を返したとしても、それが元の Map
に詰められるわけではない。デフォルト値は毎回生成される。
fruits.getValue("マンゴー")
fruits.getValue("ブドウ")
val keys = fruits.keys // [イチゴ, バナナ, ミカン]
別の Map
を作ったらもちろん withDefault
の効果は消える。
val fruits2 = fruits + mapOf("モモ" to "🍑")
val p2 = fruits2.getValue("パイナップル") // NoSuchElementException
感想
getValue
はデフォルト値を返すが、 get
は null
を返す、というのはどういうところが嬉しいんだろうか?
getValue
を使うつもりでうっかり get
を使っていた、ということが起こりそう…。使いどころがよくわからない。