代码之家  ›  专栏  ›  技术社区  ›  airas

是否可以在java流中的groupingBy中使用foreach?

  •  2
  • airas  · 技术社区  · 6 年前


    我有一张书单。有:
    作者列表(字符串)
    书名(字符串)
    和额定值(双)
    我想计算每一位作者的平均水平。
    问题是作者的名单,如果我一本书有一个作者,那就没问题了。我想这样解决它:

    Map<String, Double> result = books.stream()
                                .collect(Collectors
                                .groupingBy(Book::getAuthor, TreeMap::new, Collectors
                                .averagingDouble(Book::getRating)
    

    有人有解决方案吗?

    2 回复  |  直到 6 年前
        1
  •  1
  •   Ousmane D.    6 年前

    我会映射到 SimpleEntry 包含每个作者及其书籍,以便于分组。

    有了它,用户可以维护作者和图书对象,从而能够在通过下游收集器时从图书对象中提取任何信息。

    示例:

    Map<String, Double> resultSet = 
               books.stream()
                    .flatMap(book -> book.getAuthors()
                                         .stream()
                           .map(author -> new AbstractMap.SimpleEntry<>(author, book)))
                    .collect(Collectors.groupingBy(AbstractMap.SimpleEntry::getKey,
                            TreeMap::new,
                            Collectors.averagingDouble(e -> e.getValue().getRating())));
    
        2
  •  0
  •   chengpohi    6 年前
    Map<String, Long> result = books.stream()
    .flatMap(i -> i.getAuthors().stream())
    .collect(Collectors.groupingBy(Function.identity(),
    Collectors.counting()));
    

    压平 作者和 groupingBy identity 具有 counting 可以做到这一点。