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<Integer>),然后将所有流合并成一个总流。

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


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<T>>)。

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

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

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

相关推荐
程序员张31 小时前
Maven编译和打包插件
java·spring boot·maven
ybq195133454312 小时前
Redis-主从复制-分布式系统
java·数据库·redis
weixin_472339463 小时前
高效处理大体积Excel文件的Java技术方案解析
java·开发语言·excel
小毛驴8503 小时前
Linux 后台启动java jar 程序 nohup java -jar
java·linux·jar
DKPT4 小时前
Java桥接模式实现方式与测试方法
java·笔记·学习·设计模式·桥接模式
好奇的菜鸟5 小时前
如何在IntelliJ IDEA中设置数据库连接全局共享
java·数据库·intellij-idea
DuelCode6 小时前
Windows VMWare Centos Docker部署Springboot 应用实现文件上传返回文件http链接
java·spring boot·mysql·nginx·docker·centos·mybatis
优创学社26 小时前
基于springboot的社区生鲜团购系统
java·spring boot·后端
幽络源小助理7 小时前
SpringBoot基于Mysql的商业辅助决策系统设计与实现
java·vue.js·spring boot·后端·mysql·spring
猴哥源码7 小时前
基于Java+springboot 的车险理赔信息管理系统
java·spring boot