LambdaにおけるgroupByパケットの使い方

2773 ワード

今回のブログでは、lambdaにおけるgroupByグループ文法の使い方をご紹介します
 
まず、新しいオブジェクトを作成し、このオブジェクトの集合によって学習します.
@Data
@Builder
public class Person (){
      private int grade;
      private boolean isBoy;
}

簡単なクラスで、gradeは学年を表し、isBoyは性別を表し、男性はtrueである.
@Data、@Builderはlombokプラグインの注記であり、get/set/equals/toString/Builderの生成などの方法を支援します.
 
次に、テストクラスを作成します.
public class GroupBy_Lambda{
      omitted....
}

 
まず、統合の初期化を行います.
private static List init (){
        List persons = new ArrayList<>();
        for ( int i = 0; i < 20; i++ ){
            Person.PersonBuilder personBuilder = Person.builder();
            personBuilder.grade(i % 2);
            Person person = i % 2 == 0 ? personBuilder.isBoy(true).build()  : personBuilder.isBoy(false).build();
            persons.add(person);
        }
        return persons;
    }

 
次にグループ化します.
 List persons = init();
 Map> groupByGrade = persons.stream()
                .collect(groupingBy(Person::getGrade));
System.out.println(groupByGrade);

ここではgradeに基づいてグループ化し,keyはgrade,valueは対応するPersonの集合である.
persons.stream():コレクションをストリームに変換し、lambda式を使用できます.
.collect():収集器に相当し、グループ化されたストリームを収集できます.
groupingBy():今回のグループ化で使用したグループ化ツールはgradeに従ってグループ化します.
Person::getGrade:PersonのgetGradeメソッドを呼び出す
 
出力された結果は次のとおりです.
{0=[Person(grade=0, isBoy=true), Person(grade=0, isBoy=true), Person(grade=0, isBoy=true), Person(grade=0, isBoy=true), Person(grade=0, isBoy=true), Person(grade=0, isBoy=true), Person(grade=0, isBoy=true), Person(grade=0, isBoy=true), Person(grade=0, isBoy=true), Person(grade=0, isBoy=true)], 
1=[Person(grade=1, isBoy=false), Person(grade=1, isBoy=false), Person(grade=1, isBoy=false), Person(grade=1, isBoy=false), Person(grade=1, isBoy=false), Person(grade=1, isBoy=false), Person(grade=1, isBoy=false), Person(grade=1, isBoy=false), Person(grade=1, isBoy=false), Person(grade=1, isBoy=false)]}

gradeに従ってグループ化する作業が完了したことがわかります.
 
さらに抽出を行う場合は、groupingBy()は、次のような方法を提供します.
Map> groupByGrade_sex = persons.stream()
                .collect(groupingBy(Person::getGrade,
                        mapping(Person::isBoy, toList())));
System.out.println(groupByGrade_sex)

我々はgroupingByメソッドの内部で,isBoyというフィールドの値だけを取り出して収集する細分化を行った.
 
次は出力の結果です.
{0=[true, true, true, true, true, true, true, true, true, true], 
1=[false, false, false, false, false, false, false, false, false, false]}

 
 
Lambda式は私たちに多くの簡単な使い方を提供して開発を助けてくれて、皆さんが収穫があることを望んでいます.