以下の内容はhttps://uga-box.hatenablog.com/entry/2024/09/05/000000より取得しました。


【Kotlin】associateWith の使いどころ

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であれば、equalshashCodeが自動的に生成されるので、キーとして正常に動作する

値を取り出すとき

Person("Alice", 29)と同じフィールドを持つ別のオブジェクトをキーにしても正しく値を取得できる

これは、data classが等価性を持つため




以上の内容はhttps://uga-box.hatenablog.com/entry/2024/09/05/000000より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14