我有一本书的清单。有:
作者名单(字符串)
书的标题(字符串)
和评级(双)
我想计算每个作者的平均值。
问题是作者名单,如果我为一本书得到一位作者,那就没问题了。我想解决这个问题:
Map<String, Double> result = books.stream()
.collect(Collectors
.groupingBy(Book::getAuthor, TreeMap::new, Collectors
.averagingDouble(Book::getRating)
有人有解决方案吗?
答案 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
可以达到此目的。