当前位置: 首页 > article >正文

Java Stream API 之 flatMap

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


生活场景类比

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


代码演示

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

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

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. 实际场景:订单中的商品

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

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. 更复杂示例:拆分句子中的单词

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

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]

flatMap vs map

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

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

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

总结

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

  • 适用场景:

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

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

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

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


http://www.kler.cn/a/591392.html

相关文章:

  • 学习使用 Git 和 GitHub 开发项目的教程推荐
  • Etcd 服务搭建
  • Word 小黑第29套
  • 【k8s】containerd兼容docker镜像
  • 3DXML 与 SOLIDWORKS 格式转换:技术协同及迪威模型方案
  • 【JavaScript】三、数据类型
  • 【第13节】windows sdk编程:GDI编程
  • LeetCode 452. 用最少数量的箭引爆气球 java题解
  • springboot实现调用百度ocr实现身份识别
  • Joker靶机实战攻略
  • 《大语言模型》学习笔记(三)
  • 【R语言】lm线性回归及输出含义,置信区间,预测,R方,ggplot 拟合直线
  • 如何在前端处理文件上传,避免大文件造成的性能问题?
  • Linux并发程序设计(5):线程的相关操作
  • __str__特殊方法
  • 机器学习——数据清洗(缺失值处理、异常值处理、数据标准化)
  • 【QT:窗口】
  • 我在哪,要去哪
  • LogicFlow介绍
  • 漏洞知识点《一句话木马》