【发布时间】:2018-04-15 00:19:58
【问题描述】:
我有一个名为“Book”的数据结构,包含以下字段:
public final class Book {
private final String title;
private final BookType bookType;
private final List<Author> authors;
}
我的目标是使用 Stream API 从List<Book>派生Map<Author, List<BookType>>。
为了实现它,首先,我制作了一个 for-each 循环来阐明解决方案的步骤,然后我将它逐步重写为基于流的方法:
Map<Author, List<BookType>> authorListBookType = new HashMap<>();
books.stream().forEach(b -> b.getAuthors().stream().forEach(e -> {
if (authorListBookType.containsKey(e)) {
authorListBookType.get(e).add(b.getBookType());
} else {
authorListBookType.put(e, new ArrayList<>(Collections.singletonList(b.getBookType())));
}
}));
但它不是基于 Stream API 的解决方案,我陷入了困境,不知道如何正确完成它。
我知道我必须使用分组收集器直接从流中获取所需的Map<Author, List<BookType>>。
请给我一些提示好吗?
【问题讨论】:
-
为什么需要流解决方案?标准循环通常更易于阅读,并且在绝大多数情况下速度更快。
-
@Bohemian 我的观点也是如此。流很酷,并且非常适合某些用例,但是试图将它们硬塞到每个解决方案中是错误的。它们是一种工具,而不是一种要求。
-
我需要它来练习流
-
除了练习流之外,查看
Map的computeIfAbsent(),它将取代if-then。
标签: java lambda java-stream