使用Stream api Agregate嵌套列表

时间:2018-03-22 08:30:52

标签: java java-stream

假设我有一个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));

但它似乎不起作用,抛出了编译错误。

1 个答案:

答案 0 :(得分:15)

您可以将flatMap用于此

shelves.stream()
       .flatMap(s -> s.getBooks().stream())
       .collect(Collectors.toList());

流式传输过程非常简单:s -> s.getBooks().stream()为每个书架上的每本书制作一个流,flatMap展平所有内容,collect(Collectors.toList())将结果存储在列表中。