単一フィールドのグループ化を超えた Java 8 の複数フィールドによるグループ化
単一フィールドによるオブジェクトのグループ化は、データ処理における一般的な操作です。ただし、複数のフィールドによるグループ化が必要なシナリオが発生する可能性があります。提供されている最初のコード スニペットは、年齢フィールドによるグループ化を示しています。この記事では、同じ POJO の複数のフィールドによるグループ化のオプションについて詳しく説明します。
コレクターのチェーン
簡単なアプローチは、複数のコレクターをチェーンすることです。以下のコードは、この手法を示しています。
Map<String, Map<Integer, List<Person>>> map = people .collect(Collectors.groupingBy(Person::getName, Collectors.groupingBy(Person::getAge));
このアプローチでは、Fred という名前の 18 歳の個人のリストを取得します。
map.get("Fred").get(18);
グループ化レコードの定義
グループ化を表すクラスを作成するのも一つの方法です。ここでは、名前と年齢の組み合わせを表すためにレコードが利用されています:
class Person { record NameAge(String name, int age) {} public NameAge getNameAge() { return new NameAge(name, age); } }
その後、次のようにグループ化を実行できます:
Map<NameAge, List<Person>> map = people.collect(Collectors.groupingBy(Person::getNameAge));
グループ化されたデータ内を検索するには:
map.get(new NameAge("Fred", 18));
フレームワークからのペア クラスの使用ライブラリ
Apache Commons などのライブラリは、このタイプのシナリオ用のペア クラスを提供します。ペア クラスを使用すると、マップへのキーは次のように構築できます:
Map<Pair<String, Integer>, List<Person>> map = people.collect(Collectors.groupingBy(p -> Pair.of(p.getName(), p.getAge())));
マップから取得するには:
map.get(Pair.of("Fred", 18));
結論
Java 8 の Collectors.groupingBy() メソッドは、データをグループ化する際の柔軟性を提供します。この記事では、コレクターのチェーン化、カスタム グループ化レコードの定義、フレームワーク ライブラリのペア クラスの利用など、単一フィールドを超えてグループ化を拡張するためのさまざまなアプローチを示しました。さらに、Java のレコードを使用すると、カスタム クラスを必要とせずに、グループ化基準を簡単に定義できます。
以上がJava 8 で「Collectors.groupingBy()」を使用して複数のフィールドでデータをグループ化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。