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

相关推荐
缺点内向3 小时前
Java:创建、读取或更新 Excel 文档
java·excel
带刺的坐椅3 小时前
Solon v3.4.7, v3.5.6, v3.6.1 发布(国产优秀应用开发框架)
java·spring·solon
四谎真好看4 小时前
Java 黑马程序员学习笔记(进阶篇18)
java·笔记·学习·学习笔记
桦说编程5 小时前
深入解析CompletableFuture源码实现(2)———双源输入
java·后端·源码
java_t_t5 小时前
ZIP工具类
java·zip
lang201509285 小时前
Spring Boot优雅关闭全解析
java·spring boot·后端
pengzhuofan6 小时前
第10章 Maven
java·maven
百锦再6 小时前
Vue Scoped样式混淆问题详解与解决方案
java·前端·javascript·数据库·vue.js·学习·.net
刘一说7 小时前
Spring Boot 启动慢?启动过程深度解析与优化策略
java·spring boot·后端
壹佰大多7 小时前
【spring如何扫描一个路径下被注解修饰的类】
java·后端·spring