map 和 flatMap 的区别

这篇具有很好参考价值的文章主要介绍了map 和 flatMap 的区别。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、map 和 flatMap 对应的源码

① map方法

<R> Stream<R> map(Function<? super T, ? extends R> mapper);

② flatMap方法

<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);

可以看到,不论是 map 还是 flatMap 方法,都是对以流的形式数据的处理,返回值同样都是流形式数据的泛型。本质一样,都是 map 操作,但是不同点在于,flatMap 操作会比 map 多一个 flat 操作。 

"flat"单词本意有平的、扁平的含义,在源码中,我们对于 flatMap 方法中 API Note 有这样一句话:"The flatMap() operation has the effect of applying a one-to-many transformation to the elements of the stream, and then flattening the resulting elements into a new stream.",含义是:flatMap()操作的效果是对流的元素应用一对多转换,然后将生成的元素展平为新的流。而 map 方法的返回是:返回由将给定函数应用于此流元素的结果组成的流。

说到这里可能还是会有些不太清晰,我们用代码演示一下。

二、代码演示

① 两个类,一个 Library 类,一个 Book 类

@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
public class Library {
    private String name;
    private List<Book> book;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
public class Book {
    private String name;
    private String author;
    private Integer price;
}

② 测试类

public class StreamTest {
    public static void main(String[] args) {
        System.out.println("---------->存储的图书信息: ");
        System.out.println(initInfo());
        System.out.println("---------->测试map方法:");
        testMap();
        System.out.println("---------->测试flatMap方法:");
        testFlatMap();
    }
    private static void testMap() {
        initInfo().stream()
                .map(library -> library.getBook())
                .forEach(book -> System.out.println(book));
    }

    private static void testFlatMap() {
        initInfo().stream()
                .flatMap(library -> library.getBook().stream())
                .forEach(book -> System.out.println(book));
    }

    public static List<Library> initInfo() {
        Library library1 = new Library("新华图书", null);
        Library library2 = new Library("大家图书", null);
        Library library3 = new Library("瀚海图书", null);

        Book book1 = new Book("西游记", "吴承恩", 49);
        Book book2 = new Book("水浒传", "施耐庵", 57);
        Book book3 = new Book("三国演义", "罗贯中", 52);
        Book book4 = new Book("朝花夕拾", "鲁迅", 30);

        List<Book> library1Book = new ArrayList<>();
        List<Book> library2Book = new ArrayList<>();
        List<Book> library3Book = new ArrayList<>();

        library1Book.add(book1);
        library1Book.add(book2);

        library2Book.add(book2);
        library2Book.add(book3);

        library3Book.add(book3);
        library3Book.add(book4);

        library1.setBook(library1Book);
        library2.setBook(library2Book);
        library3.setBook(library3Book);

        return new ArrayList<>(Arrays.asList(library1, library2, library3));
    }
}

③ 测试结果

flatmap和map区别,Java基础,intellij-idea,大数据,java

我们可以看到利用 flatMap 方法后,流中的数据被展平,消除了List<Book>的层级解构,但是 map 中的数据仍然存在层级结构。

map 方法流的中间过程

flatmap和map区别,Java基础,intellij-idea,大数据,java

 flatMap 方法流的中间过程

flatmap和map区别,Java基础,intellij-idea,大数据,java

可以清楚的看到,map 方法应用后是存在层级结构的,返回的流是List<Book>组成的流,而 flatMap 中消除了List<Book>的层级结构,返回的流是 Book 组成的流。

总结:

当我们需要将具有层级结构的数据展平时,也就是将多层数据转换为单层数据操作时,我们可以使用 flatMap 方法。如果我们只是简单的对流中的数据计算或者转换时,可以使用 map 方法。

举例:

① 使用 flatMap:[a,b,c,d,[e,f [g,h,i]]] 转换为 [a,b,c,d,e,f,g,h,i]

② 使用 map: [1,2,3,4,5,6] 转换为 [11,12,13,14,15,16]

③ 使用 map: [a,b,c] 转换为 [A,B,C]文章来源地址https://www.toymoban.com/news/detail-686219.html

到了这里,关于map 和 flatMap 的区别的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java中flatMap用法

        java中map是把集合每个元素重新映射,元素个数不变,但是元素值发生了变化。而flatMap从字面上来说是压平这个映射,实际作用就是将每个元素进行一个一对多的拆分,细分成更小的单元,返回一个新的Stream流,新的流元素个数增加。     java官方给出的示例如下:    

    2024年02月02日
    浏览(51)
  • Java8 - Streams flatMap()

    https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html 它由一个 2 级 Stream 或一个二维数组组成 。 在 Java 8 中,我们可以使用 flatMap 将上述 2 级 Stream 转换为 一级 Stream 或将 二维数组转换为 一维数组。 简言之, flatmap 方法让你把一个流中的每个值都换成另一个流,然后把所有

    2024年02月03日
    浏览(36)
  • 【Kotlin】函数式编程 ① ( 函数式编程简介 | 高阶函数 | 函数类别 | Transform 变换函数 | 过滤函数 | 合并函数 | map 变换函数 | flatMap 变换函数 )

    编程范式 指的是 使用某种编程语言的 编程套路 或 编程习惯 ; 使用 Java 等高级语言进行的编程 , 编程范式 一般都是 面向对象编程 ; 与 面向对象编程 同等级的另外一种 编程范式 是 函数式编程 , 函数式编程 不依赖于 指定的语言 , 所有的编程语言都可以使用 函数式编程范式

    2024年01月18日
    浏览(47)
  • java stream flatMap的使用及个人理解

    1.我认为用简单朴素的理解和使用,是对工具最好的诠释。java jdk8开始提供了stream流,方便我更高效的操作集合和编写代码。其中flatmap流中间操作api,我认为简单来说是对“集合中的集合的操作和展开”。比如说,一个对象集合里面的每个对象还有个集合对象。这时,我们如

    2024年01月18日
    浏览(38)
  • 【Python】PySpark 数据计算 ② ( RDD#flatMap 方法 | RDD#flatMap 语法 | 代码示例 )

    RDD#map 方法 可以 将 RDD 中的数据元素 逐个进行处理 , 处理的逻辑 需要用外部 通过 参数传入 map 函数 ; RDD#flatMap 方法 是 在 RDD#map 方法 的基础上 , 增加了 \\\" 解除嵌套 \\\" 的作用 ; RDD#flatMap 方法 也是 接收一个 函数 作为参数 , 该函数被应用于 RDD 中的每个元素及元素嵌套的子元素

    2024年02月14日
    浏览(37)
  • Java开发+Intellij-idea+Maven+工程构建

    Intellij-idea是一款流行的Java集成开发环境,它支持Maven作为项目管理和构建工具。Maven可以帮助开发者自动下载项目依赖的jar包,执行编译、测试、打包等生命周期任务。本资源将介绍如何在Intellij-idea中创建、导入、转换和编译Maven工程,以及如何配置Maven的相关参数和插件。

    2024年02月01日
    浏览(111)
  • kotlin flatten 与 flatMap

    kotln中 flatten 和 flatMap 在 Kotlin 中虽然都用于扁平化处理集合,但它们的用法和效果并不完全一样 flatten 函数主要应用于嵌套集合(如 List of List 或 Set of Set 等),它会将嵌套集合中的所有元素合并到一个单一层次的集合中。 flatMap 不仅可以将嵌套集合扁平化,更重要的是它允

    2024年01月25日
    浏览(43)
  • 十二、Flink自定义 FlatMap 方法

    1、概述 1)作用 flatMap是将数据先map在打平,输入一个元素,可以输出0到多个元素 2)使用 1.匿名内部类 2.lambda表达式 3.实现FlatMapFunction接口 4.继承RichFlatMapFunction 2、代码实现 3、执行结果 1)输入测试数据 控制台输出执行结果

    2024年02月10日
    浏览(43)
  • JavaScript 数组展平方法: flat() 和 flatMap()

    从 ES2019 中开始引入了一种扁平化数组的新方法,可以展平任何深度的数组。 flat() 方法创建一个新数组,其中所有子数组元素以递归方式连接到特定深度。 语法:array.flat(depth) array : flat() 方法将在给定的数组中使用。 depth :可选参数,指定展平的深度,默认情况下,深度

    2024年02月09日
    浏览(40)
  • Java项目使用intellij-IDEA查看依赖包版本是否有冲突(方法及工具)附截图

    编译器及版本 idea-ultimate 依赖管理工具 maven Step1:点击右侧的maven Step2:右键依赖项,点击分析依赖关系 Step3:可以在模块名位置进行切换,左侧三角的标志则表示该包引入了多个版本,有冲突 Step4:可以看到当前这个包被引入了两个版本的 Step5:右键冲突的包名,可以看到

    2024年02月15日
    浏览(104)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包