假设我有一个Shelf
课程,每个Shelf
有多个Book
。
public class Shelf{
private String shelfCode;
private ArrayList<Book> books; //add getters, setters etc.
}
public class Book{
private String title;
}
现在,让我们从某种方法说我有List
Shelf
个,每个都包含一些书籍。如何使用stream
收集此列表中的所有图书?
List<Shelf> shelves = new ArrayList<Shelf>();
Shelf s1 = new Shelf();
s1.add(new Book("book1"));
s1.add(new Book("book2"));
Shelf s2 = new Shelf();
s1.add(new Book("book3"));
s1.add(new Book("book4"));
shelves.add(s1);
shelves.add(s2);
List<Book> booksInLibrary = //??
我在想像
List<Book> booksInLibrary =
shelves.stream()
.map(s -> s.getBooks())
.forEach(booksInLibrary.addall(books));
但它似乎不起作用,抛出了编译错误。
答案 0 :(得分:15)
您可以将flatMap
用于此
shelves.stream()
.flatMap(s -> s.getBooks().stream())
.collect(Collectors.toList());
流式传输过程非常简单:s -> s.getBooks().stream()
为每个书架上的每本书制作一个流,flatMap
展平所有内容,collect(Collectors.toList())
将结果存储在列表中。