Stream APIでGroupingByを使用する7つの方法

初心者にとって、通常のループの代わりにStream APIを使用する利点を想像するのは難しい場合が多く、

猫の下には、 肥大化したコードを大幅に圧縮するのに役立ついくつかの例があります













実験する労働者のクラス
public class Worker{ private String name; private int age; private int salary; private String position; public Worker(String name, int age, int salary, String position) { this.name = name; this.age = age; this.salary = salary; this.position = position; } public String getName() { return name; } public int getAge() { return age; } public int getSalary() { return salary; } public String getPosition() { return position; } }
      
      





1.労働者のリストを役職ごとにグループ化する(リストへの分割)



  Map<String, List<Worker>> map1 = workers.stream() .collect(Collectors.groupingBy(Worker::getPosition));
      
      





2.職位ごとの労働者リストのグループ化(セットへの分割)



 Map<String, Set<Worker>> map2 = workers.stream() .collect(Collectors.groupingBy(Worker::getPosition, Collectors.toSet()));
      
      





3.特定の位置にいる労働者の数の計算



 Map<String, Long> map3 = workers.stream() .collect(Collectors.groupingBy(Worker::getPosition, Collectors.counting()));
      
      





4.労働者のリストを役職別にグループ化しますが、私たちは名前だけに関心があります



 Map<String, Set<String>> map4 = workers.stream() .collect(Collectors.groupingBy(Worker::getPosition, Collectors.mapping(Worker::getName, Collectors.toSet())));
      
      





5.このポジションの平均給与の計算



 Map<String, Double> map5 = workers.stream() .collect(Collectors.groupingBy(Worker::getPosition, Collectors.averagingInt(Worker::getSalary)));
      
      





6.労働者のリストを役職別にグループ化すると、労働者は1行の名前のみで表されます。



 Map<String, String> map6 = workers.stream() .collect(Collectors.groupingBy(Worker::getPosition, Collectors.mapping(Worker::getName, Collectors.joining(", ", "{","}"))) );
      
      





7.労働者のリストを役職と年齢でグループ化します。



ユーザーj2ckのプロンプト







 Map<String, Map<Integer, List<Worker>>> collect = workers.stream() .collect(Collectors.groupingBy(Worker::getPosition, Collectors.groupingBy(Worker::getAge)));
      
      





groupingByを使用するための独自のアイデアがありますか? コメントに書いてください。








All Articles