如何使用Stream API聚合嵌套列表:从书架列表提取所有书籍
用Java Stream合并多个Shelf中的书籍到一个列表
这其实是Java Stream里非常典型的**扁平化映射(flatMap)**场景,刚好能完美解决你把多个Shelf里的Book合并成单一列表的需求。
核心解决方案
直接用flatMap将每个Shelf转换为其包含的Book流,再收集成List即可:
import java.util.stream.Collectors; // 核心代码段 List<Book> allBooks = shelves.stream() .flatMap(shelf -> shelf.getBooks().stream()) .collect(Collectors.toList());
代码解释
shelves.stream():先把Shelf列表转换成Stream<Shelf>,开启流式操作flatMap(...):这是关键的一步——它会将每个Shelf对象映射为对应的Stream<Book>,然后自动把所有这些小流合并成一个统一的Stream<Book>(也就是“扁平化”操作,把嵌套的结构展开)collect(Collectors.toList()):将最终的Book流收集为List<Book>
完整可运行示例
因为你给出的类定义缺少一些关键方法(比如Book的构造器、Shelf的add方法和getBooks方法),我补全了完整的代码,方便你直接测试:
import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; // Book类补全 class Book { private String title; public Book(String title) { this.title = title; } // 可选:添加getter用于验证结果 public String getTitle() { return title; } } // Shelf类补全 class Shelf { private String shelfCode; private ArrayList<Book> books; public Shelf() { this.books = new ArrayList<>(); } // 添加书籍的方法 public void add(Book book) { books.add(book); } // 必须的getter:获取书籍列表 public List<Book> getBooks() { return books; } // 可选:shelfCode的getter/setter public String getShelfCode() { return shelfCode; } public void setShelfCode(String shelfCode) { this.shelfCode = shelfCode; } } // 测试类 public class BookCollectionDemo { public static void main(String[] args) { // 初始化你的Shelf列表 List<Shelf> shelves = new ArrayList<>(); Shelf s1 = new Shelf(); s1.add(new Book("book1")); s1.add(new Book("book2")); shelves.add(s1); Shelf s2 = new Shelf(); s2.add(new Book("book3")); s2.add(new Book("book4")); shelves.add(s2); // 核心收集逻辑 List<Book> allBooks = shelves.stream() .flatMap(shelf -> shelf.getBooks().stream()) .collect(Collectors.toList()); // 验证输出 allBooks.forEach(book -> System.out.println("书籍标题:" + book.getTitle())); // 输出结果: // 书籍标题:book1 // 书籍标题:book2 // 书籍标题:book3 // 书籍标题:book4 } }
简化写法(方法引用)
如果你喜欢更简洁的代码,可以用方法引用替代lambda表达式,可读性同样很好:
List<Book> allBooks = shelves.stream() .map(Shelf::getBooks) // 先把每个Shelf转成List<Book> .flatMap(List::stream) // 再把每个List转成Stream并扁平化 .collect(Collectors.toList());
内容的提问来源于stack exchange,提问作者bryan.blackbee
相关产品推荐
相关产品推荐

