文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

map 和 flatMap 的区别

2023-09-07 22:36

关注

一、map 和 flatMap 对应的源码

① map方法

 Stream map(Function mapper);

② flatMap方法

 Stream flatMap(Function> 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@EqualsAndHashCodepublic class Library {    private String name;    private List book;}
@Data@NoArgsConstructor@AllArgsConstructor@EqualsAndHashCodepublic 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 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 library1Book = new ArrayList<>();        List library2Book = new ArrayList<>();        List 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 方法后,流中的数据被展平,消除了List的层级解构,但是 map 中的数据仍然存在层级结构。

map 方法流的中间过程

 flatMap 方法流的中间过程

可以清楚的看到,map 方法应用后是存在层级结构的,返回的流是List组成的流,而 flatMap 中消除了List的层级结构,返回的流是 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://blog.csdn.net/weixin_52772307/article/details/128944511

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯