KotlinのassociateWithを知ったのだが、使い所がよくわからなかったので調べた
associateWithとは
associateWithは、コレクションの各要素を値としてマップを作成する。キーは、コレクションの各要素そのもの- 値は、指定したラムダ式で生成される
使い方
val list = listOf("apple", "banana", "cherry") val map = list.associateWith { it.length } println(map) // 出力: {apple=5, banana=6, cherry=6}
説明
associateWithは、コレクション内の各要素をキーにして、そのキーに対応する値をラムダ式で指定してマップを作成する
上記の例では、各要素(果物の名前)がキーとなり、果物の名前の長さ(it.length)が値としてマップに格納される
結果として、{apple=5, banana=6, cherry=6}のようなマップが生成される
使いどころ
associateWithはコレクションの要素自体をキーにして、その要素に関連する何かを値にしたい場合に使う
上記の例のように文字列のリストならわかるが、リストなんらかのクラスのオブジェクトだった場合どうなるんだろうか
調べたら以下のような例があった
例:PersonオブジェクトのリストをassociateWithでマップに変換
1. Personクラスの定義
data class Person(val name: String, val age: Int)
2. associateWithでオブジェクトリストをマップに変換
fun main() { // Personオブジェクトのリスト val people = listOf( Person("Alice", 29), Person("Bob", 31), Person("Charlie", 15), Person("David", 42) ) // associateWithを使って年齢に基づいたカテゴリーを値にしたマップを作成 val ageCategoryMap = people.associateWith { when { it.age < 18 -> "Child" it.age in 18..35 -> "Young Adult" else -> "Adult" } } // 結果のマップを表示 println(ageCategoryMap) // 値を取り出す例 val aliceCategory = ageCategoryMap[Person("Alice", 29)] println("Alice is categorized as: $aliceCategory") val charlieCategory = ageCategoryMap[Person("Charlie", 15)] println("Charlie is categorized as: $charlieCategory") }
出力:
{
Person(name=Alice, age=29)=Young Adult,
Person(name=Bob, age=31)=Young Adult,
Person(name=Charlie, age=15)=Child,
Person(name=David, age=42)=Adult
}
Alice is categorized as: Young Adult
Charlie is categorized as: Child
Personオブジェクトのカテゴライズに使えるらしい
なんとなくわかった
ポイント
キーとしてのオブジェクト
マップからオブジェクトをキーとして値を取り出す場合、オブジェクトは等価性(equalsメソッド)やハッシュコード(hashCodeメソッド)に基づいて比較される
data classであれば、equalsとhashCodeが自動的に生成されるので、キーとして正常に動作する
値を取り出すとき
Person("Alice", 29)と同じフィールドを持つ別のオブジェクトをキーにしても正しく値を取得できる
これは、data classが等価性を持つため