You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:20:42