Kotlin でリストをマップに変換する

David Mbochi Njonge 2023年6月20日
  1. Kotlin プロジェクトを作成する
  2. Kotlin で associate() メソッドを使用してリストをマップに変換する
  3. Kotlin で associateBy() メソッドを使用してリストをマップに変換する
  4. Kotlin で associateWith() メソッドを使用してリストをマップに変換する
  5. Kotlin で groupBy() メソッドを使用してリストをマップに変換する
  6. まとめ
Kotlin でリストをマップに変換する

Kotlin はさまざまなコレクションを提供します。 最も一般的なものには、ListMap、および Set が含まれます。 アプリケーションを開発するとき、特定の目的を達成するために、あるタイプのコレクションを別のタイプのコレクションに変換する必要がある状況があります。

たとえば、重複する要素を含むリストがあり、セットが重複する要素を許可しないことがわかっているとします。 リストをセットに変換でき、重複はロジックを記述せずに削除されます。

Kotlin では、コレクションを別のタイプのコレクションに変換するためにコレクションで使用できるさまざまなメソッドを提供することで、これらの操作を実行できます。

このチュートリアルでは、List データ構造を Map データ構造に変換するために活用できるさまざまな方法を学習します。

Kotlin プロジェクトを作成する

IntelliJ を開き、New > File> Project を選択します。 開いたウィンドウで、プロジェクト名を list-to-map と入力し、言語セクションで Kotlin を選択し、ビルド システム セクションで IntelliJ を選択します。

最後に、Create ボタンを押して Kotlin プロジェクトを生成します。 kotlin フォルダーの下に Main.kt ファイルを作成し、次のコードをコピーしてファイルに貼り付けます。

data class Employee(val id: Number,
                    val firstName: String,
                    val email: String);

fun fetchEmployees(): List<Employee> {
    return listOf(
        Employee(1,"john", "john@gmail.com"),
        Employee(2,"mary","mary@gmail.com"),
        Employee(3,"jane","jane@gmail.com"),
        Employee(3,"abdul","abdul@gmail.com")
    );
}

この例では、Employee という名前の データ クラス を作成しました。これは、fetchEmployees() メソッドで従業員のリスト List<Employee> を作成するのに役立ちます。

このチュートリアルで取り上げるすべての例で fetchEmployees() メソッドを使用します。

Kotlin で associate() メソッドを使用してリストをマップに変換する

fetchEmployees() 関数の後に、次のコードをコピーして Main.kt ファイルに貼り付けます。

fun usingAssociate(employees: List<Employee>): Map<Number, String> {
    return employees.associate { employee ->
        Pair(employee.id, employee.email)
    }
}

fun main(){
    println(usingAssociate(fetchEmployees()));
}

この例では、リストを employee.id をキーとして、employee.email を文字列 Map<Number, String> として含むマップに変換しました。 マップの挿入順序は、リストにあったとおりに維持されることに注意してください。

associate() メソッドは Iterable インターフェースの拡張関数で、リスト要素の変換関数を使用してペアを作成し、このペアをマップとして返します。

作成したペアのキーと値の両方として、返したい値を明示的に指定したことに注意してください。 ペアのキーが重複している場合、古いペアは新しいペアに置き換えられます。

たとえば、リストには同じ ID の 3 を持つ 2つのオブジェクトがあり、最初のオブジェクトは jane のもので、2つ目は abdul のものです。 要素がマップに挿入されると、janeabdul に置き換えられます。

上記のコードを実行し、出力が次のようになっていることを確認します。

{1=john@gmail.com, 2=mary@gmail.com, 3=abdul@gmail.com}

Kotlin で associateBy() メソッドを使用してリストをマップに変換する

前の例をコメントアウトし、次のコードをコピーして Main.kt ファイルのコメントの後に貼り付けます。

fun usingAssociateBy(employees: List<Employee>): Map<Number, Employee> {
    return employees.associateBy { employee: Employee ->
        employee.id
    }
}

fun main(){
    println(usingAssociateBy(fetchEmployees()));
}

この例では、リストを employee.id をキーとして含む Map に変換し、従業員オブジェクトの値は Map<Number, Employee> です。

associateBy() メソッドも Iterable インターフェースの拡張関数です。 マップでキーとして使用される値を渡すだけです。

keySelector 関数は、リスト内の各オブジェクトからこのキーを取得し、マップに適用します。 マップの値は、リスト内のオブジェクトになります。

上で見たように、keySelector 関数は値 3 を持つ 2つの重複を取得することに注意してください。 古い要素は新しい要素に置き換えられます。

このコードを実行して、出力が次のようになっていることを確認します。

{1=Employee(id=1, firstName=john, email=john@gmail.com),
 2=Employee(id=2, firstName=mary, email=mary@gmail.com),
 3=Employee(id=3, firstName=abdul, email=abdul@gmail.com)}

Kotlin で associateWith() メソッドを使用してリストをマップに変換する

前の例をコメントアウトし、次のコードをコピーして Main.kt ファイルのコメントの後に貼り付けます。

fun usingAssociateWith(employees: List<Employee>): Map<Employee, Number> {
    return employees.associateWith { employee ->
        employee.id
    }
}

fun main(){
    println(usingAssociateWith(fetchEmployees()));
}

この例では、リストを、従業員オブジェクトをキーとして、employee.id を値 Map<Employee, Number> として含むマップに変換しました。

associateWith() メソッドは Iterable インターフェイスの拡張関数であり、マップで値として使用される要素を渡すだけで済みます。 valueSelector 関数は、リスト内の各オブジェクトから値を取得し、それらをマップに適用します。

マップのキーがリストの要素になります。 オブジェクトはマップのキーであるため、重複はありませんが、マップ内の 2つの要素の値は 3 になります。

このコードを実行して、出力が次のようになっていることを確認します。

{Employee(id=1, firstName=john, email=john@gmail.com)=1,
 Employee(id=2, firstName=mary, email=mary@gmail.com)=2,
 Employee(id=3, firstName=jane, email=jane@gmail.com)=3,
 Employee(id=3, firstName=abdul, email=abdul@gmail.com)=3}

Kotlin で groupBy() メソッドを使用してリストをマップに変換する

前の例をコメントアウトし、次のコードをコピーして Main.kt ファイルのコメントの後に貼り付けます。

fun usingGroupBy(employees: List<Employee>): Map<Number, List<Employee>> {
    return employees.groupBy { employee: Employee ->
        employee.id
    }
}

fun main(){
    println(usingGroupBy(fetchEmployees()));
}

最初の例では、リストをマップに変換するときに重複が置き換えられることを見てきました。 複製を維持したい状況では、groupBy() メソッドを使用します。

この例では、リストを employee.id としてキーを含むマップに変換しました。値は、ID Map<Number, List<Employee>> でグループ化された従業員オブジェクトのリストです。

groupBy() メソッドも Iterable インターフェイスの拡張関数であり、マップでキーとして使用される値を渡すだけで済みます。 このメソッドの keySelector 関数は、リスト内の各オブジェクトからキーを取得し、マップに適用します。

同じ ID を持つオブジェクトは 1つのリストにグループ化されます。 このコードを実行して、出力が次のようになっていることを確認します。

{1=[Employee(id=1, firstName=john, email=john@gmail.com)],
 2=[Employee(id=2, firstName=mary, email=mary@gmail.com)],
 3=[Employee(id=3, firstName=jane, email=jane@gmail.com),
    Employee(id=3, firstName=abdul, email=abdul@gmail.com)]}

まとめ

このチュートリアルでは、Iterable インターフェイスのさまざまな拡張機能を利用して、リストをマップに変換する方法を学びました。 ここで説明したメソッドには、associate() メソッド、associateBy() メソッド、associateWith() メソッド、および groupBy() メソッドの使用が含まれます。

groupingBy()groupByTo() など、他のグループ化戦略を使用できることに注意してください。

David Mbochi Njonge avatar David Mbochi Njonge avatar

David is a back end developer with a major in computer science. He loves to solve problems using technology, learning new things, and making new friends. David is currently a technical writer who enjoys making hard concepts easier for other developers to understand and his work has been published on multiple sites.

LinkedIn GitHub

関連記事 - Kotlin List