java中flatMap用法完整示例

 更新时间:2023年05月17日 16:13:15   作者:luffy5459  
flatMap是java8的Stream流的一个方法,下面这篇文章主要给大家介绍了关于java中flatMap用法的相关资料,文中通过示例代码和图文介绍的非常详细,需要的朋友可以参考下

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

java官方给出的示例如下:

# 按行读取文件内容
Stream<String> lines = Files.lines(path);
# 将每一行文字按照空格拆分为单词
Stream<String> words = lines.flatMap(line -> Stream.of(line.split(" +")));

如下所示的文本:

hello world
this is a test txt
done

经过这个转换,得到的结果如下:

[hello, world, this, is, a, test, txt, done]

我们大概知道,flatMap压平的作用,就是把原来的三行字符串文字变为了一个流,流数组中每个元素是单词。 

============

我们假设有这样的需求,有一个[[1,3],[2,4]]的二维数组,我们要得到一个一维数组[1,3,2,4]。那么这里的flatMap就正好排上用场,原来是二维的,现在压平为一维,正好分解了。

List<Integer> lista = new ArrayList<>();
lista.add(1);
lista.add(3);
List<Integer> listb = new ArrayList<>();
listb.add(2);
listb.add(4);
List<List<Integer>> listc = new ArrayList<>();
listc.add(lista);
listc.add(listb);
System.out.println(listc);
List<Integer> listd = listc.stream().flatMap(ele -> ele.stream()).collect(Collectors.toList());
System.out.println(listd);

运行程序打印信息如下:

[[1, 3], [2, 4]]
[1, 3, 2, 4]

flatMap里面需要传入一个Function参数,这里根据需要将数组转为stream。其实可以直接传入一个函数名:Collection::stream,效果是一样的。

完整代码如下:

package org.example;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class FlatMapExample {
    public static void main(String[] args) {
        List<Integer> lista = new ArrayList<>();
        lista.add(1);
        lista.add(3);
        List<Integer> listb = new ArrayList<>();
        listb.add(2);
        listb.add(4);
        List<List<Integer>> listc = new ArrayList<>();
        listc.add(lista);
        listc.add(listb);
        System.out.println(listc);
        List<Integer> listd = listc.stream().flatMap(Collection::stream).collect(Collectors.toList());
        System.out.println(listd);
        try {
            Stream<String> stream = Files.lines(Paths.get("test.txt"));
            // stream.forEach(System.out::println);
            List<String> words = stream.flatMap(line -> Stream.of(line.split(" +"))).collect(Collectors.toList());
            System.out.println(words);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

运行截图:

Stream对象经过一次操作之后,内容就会被清除,同时流也被关闭。如果还进行第二次其他操作,那么就会报错:

stream has already been operated upon or closed 

所以进行流操作,一般都是把所有的流程都以链式写法写在一起,最后得到结果。

总结

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

相关文章

  • Spring Boot使用MyBatis进行两个表的关联

    Spring Boot使用MyBatis进行两个表的关联

    本文主要介绍了Spring Boot使用MyBatis进行两个表的关联,通过实例演示了如何使用MyBatis的XML映射文件和注解实现关联操作,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • JavaFX 监听窗口关闭事件实例详解

    JavaFX 监听窗口关闭事件实例详解

    这篇文章主要介绍了JavaFX 监听窗口关闭事件实例详解的相关资料,需要的朋友可以参考下
    2017-05-05
  • SpringBoot的父级依赖:spring-boot-starter-parent详解

    SpringBoot的父级依赖:spring-boot-starter-parent详解

    SpringBoot通过父级依赖spring-boot-starter-parent实现项目快速构建,它依赖于spring-boot-dependencies来统一管理项目中的依赖版本,省去了手动指定版本信息的麻烦,这种机制不仅规定了默认的Java版本和编码格式
    2024-09-09
  • Spring Boot四大神器之CLI的具体使用

    Spring Boot四大神器之CLI的具体使用

    本文主要介绍了Spring Boot四大神器之CLI的具体使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-10-10
  • java学习指南之字符串与正则表达式

    java学习指南之字符串与正则表达式

    在日常Java后端开发过程中,免不了对数据字段的解析,自然就少不了对字符串的操作,这其中就包含了正则表达式这一块的内容,下面这篇文章主要给大家介绍了关于java学习指南之字符串与正则表达式的相关资料,需要的朋友可以参考下
    2023-05-05
  • SpringBoot @PostConstruct和@PreDestroy的使用说明

    SpringBoot @PostConstruct和@PreDestroy的使用说明

    这篇文章主要介绍了SpringBoot @PostConstruct和@PreDestroy的使用说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • mybatis中${}和#{}的区别以及底层原理分析

    mybatis中${}和#{}的区别以及底层原理分析

    这篇文章主要介绍了mybatis中${}和#{}的区别以及底层原理,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • spring cloud gateway网关路由分配代码实例解析

    spring cloud gateway网关路由分配代码实例解析

    这篇文章主要介绍了spring cloud gateway网关路由分配代码实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • java开发实现五子棋游戏

    java开发实现五子棋游戏

    这篇文章主要为大家详细介绍了java开发实现五子棋游戏,具有双人对战和人机对战功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Mybatis-Plus中updateById方法不能更新空值问题解决

    Mybatis-Plus中updateById方法不能更新空值问题解决

    本文主要介绍了Mybatis-Plus中updateById方法不能更新空值问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08

最新评论