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让复杂的数据处理变得简洁清晰! 🚀

相关推荐
snow@li8 分钟前
Java:跨平台原理与JDK、JRE、JVM全景深度解析
java·开发语言·jvm
覆东流12 分钟前
2.Java程序基础
java·开发语言·后端
snow@li17 分钟前
SpringBoot:全套生命周期全景详解/应用级+Bean级
java·spring boot·rpc
love_muming30 分钟前
二叉树操作全解析:从递归到层序遍历
java·数据结构·算法·二叉树
小的~~31 分钟前
ThreadLocal 、InheritableThreadLocal 与 TransmittableThreadLocal 的进阶指南
java·开发语言
北极糊的狐41 分钟前
钉钉小程序报错data.formatTime is not a function是因为 axml 模板中不能直接调用 Page 内自定义方法!
java·小程序·钉钉
·薯条大王10 小时前
经济实惠玩云服务器|一台云服务器多人共用,子账号配置教程
java·linux·运维·服务器·汇编·c++·python
ZJH__GO13 小时前
网络编程v4pro--实现聊天室文件传输功能
java·服务器·网络·计算机网络
程序员黑豆13 小时前
Windows 系统 Java 环境变量配置全攻略:解决“不是内部或外部命令”
java·前端·ai编程
命运之光13 小时前
【C语言完整代码】就诊信息管理系统
java·c语言·开发语言