Java Stream API 之 flatMap

flatMap 是 Java Stream API 中一个非常实用的操作,但它对新手来说可能有点抽象。我会通过一个简单的生活场景和代码示例来让小白理解它。


生活场景类比

假设你有一个"大盒子",里面装着多个"小盒子",每个小盒子里有一些水果。现在你想把所有小盒子里的水果合并到一个大篮子 里。这时候flatMap 的作用就是:拆开每个小盒子,把里面的水果全部倒进大篮子


代码演示

1. 简单示例:扁平化嵌套列表

假设有一个嵌套的列表结构,我们想将所有元素合并成一个"平面"列表:

java 复制代码
List<List<Integer>> nestedList = Arrays.asList(
    Arrays.asList(1, 2, 3),
    Arrays.asList(4, 5),
    Arrays.asList(6)
);

// 使用 flatMap 将所有子列表合并成一个流
List<Integer> flatList = nestedList.stream()
    .flatMap(list -> list.stream()) // 将每个子列表转为流,并合并
    .collect(Collectors.toList());

System.out.println(flatList); // 输出 [1, 2, 3, 4, 5, 6]

解释:

  • flatMap 的作用:将每个子列表(如 [1,2,3] )转换为一个独立的流(Stream),然后将所有流合并成一个总流。

  • 如果没有 flatMap ,直接使用 map ,会得到Stream<Stream>,而不是合并后的结果。


2. 实际场景:订单中的商品

假设你有一个订单列表,每个订单包含多个商品。现在要提取所有订单中的所有商品:

java 复制代码
class Order {
    private List<String> products;

    public Order(List<String> products) {
        this.products = products;
    }

    public List<String> getProducts() {
        return products;
    }
}

// 创建订单列表
List<Order> orders = Arrays.asList(
    new Order(Arrays.asList("苹果", "香蕉")),
    new Order(Arrays.asList("西瓜", "葡萄")),
    new Order(Arrays.asList("橙子"))
);

// 提取所有商品
List<String> allProducts = orders.stream()
    .flatMap(order -> order.getProducts().stream()) // 将每个订单的商品转为流,合并
    .collect(Collectors.toList());

System.out.println(allProducts); // 输出 [苹果, 香蕉, 西瓜, 葡萄, 橙子]

3. 更复杂示例:拆分句子中的单词

假设有一个句子列表,需要将所有单词拆分并去重:

java 复制代码
List<String> sentences = Arrays.asList(
    "Hello World",
    "Java Stream API",
    "flatMap example"
);

// 拆分所有单词并去重
List<String> words = sentences.stream()
    .flatMap(sentence -> Arrays.stream(sentence.split(" "))) // 将每个句子拆分为单词流
    .distinct() // 去重
    .collect(Collectors.toList());

System.out.println(words); // 输出 [Hello, World, Java, Stream, API, flatMap, example]

flatMapvs map

  • map:一对一转换(例如将数字转为字符串)。

    java 复制代码
    Stream.of(1, 2, 3).map(n -> n * 2); // 结果 [2, 4, 6]
  • flatMap:一对多转换,并合并结果(例如将列表的列表合并为单个列表)。

    java 复制代码
    Stream.of(Arrays.asList(1,2), Arrays.asList(3,4))
        .flatMap(list -> list.stream()); // 结果 [1, 2, 3, 4]

总结

  • flatMap 的核心作用:将嵌套结构"扁平化",合并多个流为一个流。

  • 适用场景:

    • 处理嵌套集合(如List<List>)。

    • 分解元素(如拆分句子中的单词)。

    • 合并多个数据源的结果。

通过这种方式,flatMap让复杂的数据处理变得简洁清晰! 🚀

相关推荐
微尘寒风5 小时前
【Git】的安装和使用
java·git
y = xⁿ5 小时前
DeepSeek Harness 学习日记:关于Agent接口,工具调用的底层实现
android·java·学习
侧耳倾听1116 小时前
jwt使用简介
java·jwt
顶点多余7 小时前
那些在算法中适合巩固的知识点---1
java·前端·算法
AI人工智能+电脑小能手7 小时前
大白话说Java设计模式-46-责任链模式(业务实战篇)
java·设计模式·责任链模式·风控校验·servlet filter·spring interceptor·链式处理
jay神7 小时前
【计算机毕业设计】基于SpringBoot的程序教学辅助系统
java·前端·vue.js·spring boot·后端·毕业设计·课程设计
2601_962066498 小时前
【Sql Server】Update中的From语句,以及常见更新操作方式
android·java·数据库
yaoxin5211239 小时前
507. Java 反射 - 在 BeanFactory 中实现依赖注入
java·开发语言
OPEN-F9 小时前
C++模板教程:变参模板、折叠表达式与SFINAE
java·开发语言·c++
2601_9620722110 小时前
SpringMVC进阶(自定义拦截器以及异常处理)
java