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)
上一篇 2022年6月4日 上午11:46
下一篇 2022年6月4日 上午11:46


相关推荐

  • CTF-培根密码

    CTF-培根密码CTF 学习上的一些疑点和解疑主题 培根密码的随意性反正我是觉得挺离谱的序章 CTF 学习上的一些疑点和解疑前言 培根小贴士一 培根密码是什么 二 解答 1 题目 2 解密顺序总结还没听懂的我给大家展现一些例子 前言 培根小贴士培根密码是一个随意性很高的密码 初学的时候不仅让人疑惑而且会感到奇奇怪怪 至少我是这样的 一 培根密码是什么 相信来到这里的人应该都有稍微的了解过这个培根密码 但是为了让像我一样懒的人方便我就放一下培根密码的两种方式二 解答 1 题目这个呢就是我在实训遇到的题目了

    2026年3月18日
    1
  • c自定义标题栏

    c自定义标题栏最近在编写 C S 结构应用程序时 感觉窗体的标题栏样式太死板了 标题文字不能更改大小 颜色 字体等 按钮不能隐藏等问题 在网上也查找了许多相关的资料 没有找到合适的解决方案 发现许多人也在寻求这个问题 最后我决定自己研究动手画一个标题栏出来 经过今天一天的研究与编写 终于完成全部功能 现公布一下我的设计思路 一 去掉 Form 类自带的标题栏

    2026年3月26日
    2
  • 使用vscode编写、运行Python程序[通俗易懂]

    使用vscode编写、运行Python程序[通俗易懂]最近准备推出一系列Python入门、Pytorch深度学习框架入门的文章,主要面向计算机视觉小白。为了给非计算机专业的读者、或者刚入门计算机视觉的读者打好基础,前几天特意写了一篇入门文章,介绍了计算机视觉中一些最基础的概念和名词:Hereisyuquedoccard,clickonthelinktoview:https://www.yuque.com/zhangkai-bazwc/gmeyak/ouxwcg今天主要和大家分享在vscode中编写、运行Python程序的方法,以

    2025年8月11日
    5
  • 【ShaderLab学习】AlphaTest & AlphaBlend理解[2]

    【ShaderLab学习】AlphaTest & AlphaBlend理解[2]AlphaBlend 透明混合使用当前片元的透明度作为混合因子 与已存储在颜色缓冲中的颜色值进行混合 得到新的颜色 需要注意的是 透明度混合需要关闭深度写入 这时候要注意物体的渲染顺序 源颜色 当前片元颜色 sourcecolor 用 S 或者 SrcColor 表示目标颜色 颜色缓冲中的颜色 destinationc 用 D 或者 DstColor 表示官方文档 https docs

    2026年3月18日
    2
  • Totalcmd瘾君子

    Totalcmd瘾君子张博说 blog 更新频率反映工作量大小 有空时挖坑没空时潜水 诚不我欺也 最近潜水潜的消化不良了 上来冒个泡 刚才更新了一把自己的 Totalcmd 到 7 01 目前发现最有用的新功能大概是比较文件的同时可以编辑了 也就是说可以同步了 此外还支持了 SFTP 搜索 ftpserver 可以记录操作 log 以及许多可用性上的更新 Totalcmd 是个共享软件 是我在 thinkpad 上坚持使用 wind

    2026年3月18日
    2
  • 移动巡检系统_智能巡检app

    移动巡检系统_智能巡检app移动巡检系统我国的石油、燃气、自来水、电力的线路、管道和设备的巡检、陷巡视管理工作主要依靠巡检人员定期定时的人工巡检。传统的巡检工作主要采用手工纸记录的方式,不仅工作量巨大,效率低下,而且纸质的缺陷报

    2022年8月6日
    15

发表回复

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

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