読者です 読者をやめる 読者になる 読者になる

groupingBy

toMap でオブジェクトをグループ分けするか、groupingBy を使うか?

サンプルとして、以下のようなオブジェクトと、リストを作るメソッド

public class Author{
   public String level;
   public String name;

   public Author(String level, String name){
      this.level = level;
      this.name = name;
   }
}

private static List<Author> createAuthors(){
   return Arrays.asList(
      new Author("A", "あああ"),
      new Author("A", "いいい"),
      new Author("A", "ううう"),
      new Author("B", "えええ"),
      new Author("C", "おおお"),
      new Author("C", "かかか")
   );
}



Logger logger = LoggerFactory.getLogger(Sample.class);
List<Author> authors = createAuthors();

Map<String, List<Author>> mapAuthors = authors.stream().collect(Collectors.toMap(t->t.level, u->new ArrayList<Author>(Collections.singletonList(u))
   ,
 (List<Author> u1, List<Author> u2)->Stream.concat(u1.stream(), u2.stream()).collect(Collectors.toList())
));

toMap で生成する。。。

// 結果
mapAuthors.keySet().stream().forEach(key->{
   logger.debug("lebel = " + key);
   mapAuthors.get(key).stream().map(a->"\t"+ a.level + "--" + a.name).forEach(logger::debug);
});

groupingBy で生成する

Map<String, List<Author>> mapAuthors2 = authors.stream().collect(Collectors.groupingBy(t->t.level, Collectors.mapping(u->u, Collectors.toList())));

// 結果
mapAuthors2.keySet().stream().forEach(key->{
   logger.debug("lebel = " + key);
   mapAuthors2.get(key).stream().map(a->"\t"+ a.level + "--" + a.name).forEach(logger::debug);
});

カウントなら、、

Map<String, Long> countmap =
authors.stream().collect(Collectors.groupingBy(t->t.level, Collectors.mapping(u->u, Collectors.counting())));