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

时间:2018-04-02 05:03:29

标签: java java-stream


我有一本书的清单。有:
作者名单(字符串)
书的标题(字符串)
和评级(双) 我想计算每个作者的平均值。
问题是作者名单,如果我为一本书得到一位作者,那就没问题了。我想解决这个问题:

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

有人有解决方案吗?

2 个答案:

答案 0 :(得分:1)

我会映射到包含每位作者及其图书的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())));

答案 1 :(得分:0)

Map<String, Long> result = books.stream()
.flatMap(i -> i.getAuthors().stream())
.collect(Collectors.groupingBy(Function.identity(),
Collectors.counting()));

展平作者和groupingBy identity counting可以达到此目的。