Java 8 で「Collectors.groupingBy()」を使用して複数のフィールドでデータをグループ化するにはどうすればよいですか?

Patricia Arquette
リリース: 2024-11-24 10:27:11
オリジナル
653 人が閲覧しました

How Can I Group Data by Multiple Fields in Java 8 Using `Collectors.groupingBy()`?

単一フィールドのグループ化を超えた 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート