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的区别了

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 硬件知识:DP接口和HDMI接口对比,看完你就懂了!

    硬件知识:DP接口和HDMI接口对比,看完你就懂了!电脑显示器高清传输通过会用到两个接口,就是DP接口和HDMI接口,今天电脑学习小编带大家对比一下这两个接口。一、DP接口DisplayPort缩写DP,是一个由PC及芯片制造商联盟开发,视…

  • Leetcode: Shortest Word Distance II

    Leetcode: Shortest Word Distance II

  • pycharm怎么打包成exe文件_pycharm打包成可执行文件

    pycharm怎么打包成exe文件_pycharm打包成可执行文件一.pycharm打包exe时加上窗体及exe桌面图标1.首先添加图片文件转py文件得工具pyrcc打开File中的Settings2.按步骤添加工具名称Name:PyqrcProgram:C:\anaconda3\Scripts\pyrcc5.exeArguments:FileNameFileNameFileName-oFileNameWithoutExtensionFileNameWithoutExtensionFileNameWithoutExtension_rc.pyWorkin

  • [UML] 类图介绍 —— 程序员(灵魂画手)必备画图技能之一

    [UML] 类图介绍 —— 程序员(灵魂画手)必备画图技能之一统一建模语言(UnifiedModelingLanguage,UML)可分类成:功能模型:从用户的角度展示系统的功能,包括用例图。对象模型:采用对象,属性,操作,关联等概念展示系统的结构和基础,包括类别图、对象图。动态模型:展现系统的内部行为。包括序列图,活动图,状态图。类图说到类图,它包含的东西确实有点多,你去网上看总能看到,同样都是类图,但是好像各有各家的章法,总让人摸不着头脑。要么少个箭头要么实线变成虚线了… 那这个类图到底有没有标准呢?别慌,有的,《大话设.

  • httpclient4.x访问https[通俗易懂]

    httpclient4.x访问https[通俗易懂]https有单向认证和双向认证之分,单向认证即客户端只会认证服务端,双向认证是客户端需要认证服务端,服务端也需要认证客户端。先说单向认证,浏览器访问服务端,服务端接收请求,会把证书(包含密钥和其他信息)和加密后响应返回给浏览器。如果这个证书不是向第三方权威机构申请的,浏览器会提示证书有问题(使用httpclient访问的话会报错)。如果忽略错误,则浏览器接受证书并解密响应,发送的数据也用此密钥

  • Memory barrier 简介

    Memory barrier 简介"Memorybarrier"Memorybarrier简介程序在运行时内存实际的访问顺序和程序代码编写的访问顺序不一定一致,这就是内存乱序访问。内存乱序访问行为出现的理

发表回复

您的电子邮箱地址不会被公开。

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