Java中map和flatMap的区别举例详解

 更新时间:2023年10月31日 11:26:55   作者:LOVE️YOU  
这篇文章主要给大家介绍了关于Java中map和flatMap区别的相关资料,在Java中Stream接口有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 方法后,流中的数据被展平,消除了List<Book>的层级解构,但是 map 中的数据仍然存在层级结构。

map 方法流的中间过程

 flatMap 方法流的中间过程

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

附:相关问题

那我要是这种3层数据结构呢?,怎么把它们展开转化为大写字母?

[ [ ['a', 'b'], ['c', 'd'] ], [ ['e', 'f'], ['g', 'h'] ] ]  ==>
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']

很简单,先flatMap展开两层,然后map就好了。

val orgList: List<List<List<Char>>> = listOf(
  listOf(
    listOf('a', 'b'),
    listOf('c', 'd')
  ),
  listOf(
    listOf('e', 'f'),
    listOf('g', 'h')
  )
)

val transList = orgList.flatMap { outterList ->
    outterList.flatMap { innerList ->
       innerList.map { charStr ->
           charStr.uppercaseChar()
       }
  }
}

总结:

当我们需要将具有层级结构的数据展平时,也就是将多层数据转换为单层数据操作时,我们可以使用 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]

到此这篇关于Java中map和flatMap的区别的文章就介绍到这了,更多相关Java map和flatMap区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • java实现读取txt文件并以在每行以空格取数据

    java实现读取txt文件并以在每行以空格取数据

    今天小编就为大家分享一篇java实现读取txt文件并以在每行以空格取数据,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • springboot通过jar包启动中文日志乱码问题及解决

    springboot通过jar包启动中文日志乱码问题及解决

    这篇文章主要介绍了springboot通过jar包启动中文日志乱码问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • IDEA 2020.3 更新了机器学习都整上了

    IDEA 2020.3 更新了机器学习都整上了

    IDEA 欢迎窗口全新升级,首页增加三个选项卡,一个用于设置 IDE 界面的 Customize,一个用于插件安装的 Plugins,一个于访问帮助和学习资源的 Learn IntelliJ IDEA,另外包括之前用于管理项目的 Projects,需要的朋友可以参考下
    2020-12-12
  • Java算法之桶排序Bucket Sort详解

    Java算法之桶排序Bucket Sort详解

    这篇文章主要介绍了Java算法之桶排序Bucket Sort详解,桶排序(Bucket Sort)又称箱排序,是一种比较常用的排序算法,其算法原理是将数组分到有限数量的桶里,再对每个桶分别排好序,最后一次将每个桶中排好序的数输出,需要的朋友可以参考下
    2023-10-10
  • java图形界面之加法计算器

    java图形界面之加法计算器

    这篇文章主要为大家详细介绍了java图形界面之加法计算器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • 关于maven项目引入maven库没有的jar处理办法

    关于maven项目引入maven库没有的jar处理办法

    这篇文章主要介绍了关于maven项目引入maven库没有的jar处理办法,在平时开发中,有些jar包是不存在maven中央库中的,那么此时该如何解决才能方便后续处理呢,需要的朋友可以参考下本文
    2023-03-03
  • springboot+mybatis配置控制台打印sql日志的方法

    springboot+mybatis配置控制台打印sql日志的方法

    这篇文章主要介绍了springboot+mybatis配置控制台打印sql日志的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Spring中容器创建的四种方式示例

    Spring中容器创建的四种方式示例

    这篇文章主要介绍了Spring中容器创建的四种方式示例,Spring容器是Spring框架的核心部分,它负责管理和组织应用程序中的对象,它提供了一种轻量级的、非侵入式的方式来实现对象的创建、依赖注入和生命周期管理,需要的朋友可以参考下
    2023-10-10
  • MyBatis SpringMVC整合实现步骤详解

    MyBatis SpringMVC整合实现步骤详解

    这篇文章主要介绍了MyBatis SpringMVC整合实现步骤详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • 一文搞懂Spring中的JavaConfig

    一文搞懂Spring中的JavaConfig

    这篇文章主要介绍了Spring中的JavaConfig知识,包括事务注解驱动,properties配置文件加载方法,本文给大家介绍的非常详细,需要的朋友可以参考下
    2021-09-09

最新评论