java8中的map与flatmap

java8中的map与flatmap问题假如我们有这样一个需求给定单词列表[“Hello”,”World”],你想要返回列表[“H”,”e”,”l”,”o”,”W”,”r”,”d”],如果我们使用java实现这个需求,你会怎么实现呢?可能我们第一个想法是下面这种写法:words.stream().map(word->word.split(“”)).distinct().collect(toList());但是如果我们运行会发现这样的写法是不正确的,这个方法的问题在于,传递给map方法的Lambda为每个单词返回

大家好,又见面了,我是你们的朋友全栈君。

问题

假如我们有这样一个需求给定单词列表[“Hello”,”World”],你想要返回列表[“H”,”e”,”l”, “o”,”W”,”r”,”d”],如果我们使用java实现这个需求,你会怎么实现呢?可能我们第一个想法是下面这种写法:

words.stream()
.map(word -> word.split(""))
.distinct()
.collect(toList());

但是如果我们运行会发现这样的写法是不正确的,这个方法的问题在于,传递给map方法的Lambda为每个单词返回了一个String[](String列表)。因此, map 返回的流实际上是Stream 类型的。你真正想要的是用
Stream来表示一个字符流。因此,这是行不通的。

我们带着上面的问题进行下面的分析:

map和flatmap的区别

map:对于stream中包含的元素使用 特定的转换函数进行转换操作,新生成的Stream只包含转换生成的元素。这个方法有三个对于原始类型的变种方法,分别是mapToInt,mapToLong和mapToDouble.这三个方法比较好理解,比如mapToInt就是把原始的Stream转换成一个新的Stream,这个新生成的Stream中的元素map方法示意图:

                            java8中的map与flatmap

flatMap:和map类似,不同的是每个元素 转换得到是Stream对象,会把子Stream中的元素压缩到父集合中:

flatMap方法示意图:  

                                java8中的map与flatmap

如果我们用一句话来总结flatmap:

把几个小的list转换成一个大的list

                               java8中的map与flatmap

解决问题:

 对于我们开始提出的问题,我们分为两步来完成:

1、分隔字符串,将数据中的字母都分隔开,形成多个小list新的stream

2、组装成新的list


        String[] strings = {"Hello", "World"};
        List<String> collect = Stream.of(strings)
                .map(s -> s.split(""))
                .flatMap(s -> Stream.of(s))
                .distinct()
                .collect(Collectors.toList());

        collect.forEach(c->{
            System.out.println(c);
        });

这样我们就可以很好地理解map和flatmap的区别了

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/135984.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 完全分布式搭建HDFS分布式文件存储系统

    完全分布式搭建HDFS分布式文件存储系统三分钟上手,完全分布式搭建HDFS文章目录三分钟上手,完全分布式搭建HDFS一,环境的准备二,开始安装及相关配置文件2.1下载解压缩hadoop2.2配置etc/hadoop/hadoop-env.sh2.3配置core-site.xml2.4hdfs-site.xml配置2.5写上**SNN**节点名:node022.6配置datanode存放服务器2.7分发节点…

    2022年6月10日
    47
  • Java安全之JNI绕过RASP

    Java安全之JNI绕过RASP0x00前言前面一直想看该JNI的相关内容,但是发现JNI的资料还是偏少。后面发现JNI在安全中应用非常的微妙,有意思。0x01JNI概述JNI的全称叫做(

    2021年12月12日
    49
  • python实现交叉验证_kfold显示不可迭代

    python实现交叉验证_kfold显示不可迭代KFold模块fromsklearn.model_selectionimportKFold为什么要使用交叉验证?交叉验证的介绍交叉验证是在机器学习建立模型和验证模型参数时常用的办法。交叉验证,顾名思义,就是重复的使用数据,把得到的样本数据进行切分,组合为不同的训练集和测试集,用训练集来训练模型,用测试集来评估模型预测的好坏。在此基础上可以得到多组不同的训练集和测试集,某次训练集中的某样本在…

    2022年9月20日
    2
  • 本地计算机上的task scheduler服务启动后停止_task

    本地计算机上的task scheduler服务启动后停止_task1.如果对应服务依赖都正常情况下,请参考下面解决方案进入注册表(cmd–>regedit,依次找到HKEY_LOCAL_MACHINE\HKEY_LOCAL_MACHINE\SOFTWARE\MICROSOFT\RPC\INTERNET,删除INTERNET,重启服务器注:删除前请导出备份…

    2022年10月11日
    3
  • 记一次固态硬盘数据恢复

    记一次固态硬盘数据恢复背景15年初的时候买过一个128G的固态硬盘,在自己的笔记本电脑上组了一个双硬盘(ssd+hdd),ssd作为系统盘。到今年也已经用了三年了。昨天上午的时候,电脑突然蓝屏报错,本来以为是一次简单的蓝屏故障,但是发现电脑重启之后,电脑报错找不到硬盘。当时心里一凉,难道硬盘寿终就寝了,但是硬盘坏了不重要,里面的数据还没有备份会比较可怕。赶快用一个winpe系统把电脑开起来,想看看数据是否还在。然…

    2022年9月20日
    1
  • sudo命令 sudoers文件

    sudo命令 sudoers文件超级用户权限授权规则含义root ALL=(ALL:ALL)ALL用户名root ALL=(ALL:ALL)ALL主机名root ALL=(**ALL:ALL**)ALL目标用户:组,以谁的身份去执行root ALL=(ALL:ALL)**ALL**命令别名定义>Host_Alias:主机的列表>User_Alias:具有sudo权限的用户的列表

    2022年6月20日
    28

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号