Java 8 ストリームを使用して複数のフィールドでデータをグループ化するにはどうすればよいですか?

DDD
リリース: 2024-11-26 11:13:09
オリジナル
849 人が閲覧しました

How Can I Group Data by Multiple Fields Using Java 8 Streams?

Java 8 での複数のフィールドによるグループ化

オブジェクトをフィールド名でグループ化する場合、Java 8 では Collectors.groupingBy() メソッドが提供されます。しかし、複数のフィールドでグループ化する必要がある場合はどうすればよいでしょうか?

オプション 1: コレクターの連鎖

1 つの方法は、複数の Collectors.groupingBy() 呼び出しを連鎖させることです。

Map<String, Map<Integer, List<Person>>> map = people
                .collect(Collectors.groupingBy(Person::getName,
                        Collectors.groupingBy(Person::getAge)));
ログイン後にコピー

これにより、最初のレベルが名前でグループ化され、2 番目のレベルが年齢でグループ化されたネストされたマップが作成されます。 Fred という名前の 18 歳の人々のリストを取得するには:

map.get("Fred").get(18);
ログイン後にコピー

オプション 2: グループ化レコードの定義

あるいは、クラス (例: NameAge) グループ分けを表しますフィールド:

class NameAge implements Comparable<NameAge> {
    String name;
    int age;
    
    // Constructor, getters, compareTo, etc.
}
ログイン後にコピー

次に、NameAge レコードでグループ化します:

Map<NameAge, List<Person>> map = people
                .collect(Collectors.groupingBy(Person::getNameAge));
ログイン後にコピー

取得するには:

map.get(new NameAge("Fred", 18));
ログイン後にコピー

オプション 3: ペア クラスの使用

カスタム グループ化レコードの実装が望ましくない場合は、 Apache Commons や Java の新しい java.util.function.Pair などのライブラリのペア クラス。たとえば、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));
ログイン後にコピー

推奨事項

アプローチの選択は、特定の要件によって異なります。 。レコードは簡潔で明確なソリューションを提供しますが、より複雑なシナリオには Apache Commons のようなライブラリが推奨される場合があります。

以上がJava 8 ストリームを使用して複数のフィールドでデータをグループ化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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