java8 stream to map_Java 8 Stream Api 中的 map和 flatMap 操作

1.前言

Java 8 提供了非常好用的 Stream API ,可以很方便的操作集合。今天我们来探讨两个 Stream 中间操作 map 和 flatMap

2. map 操作

map 操作是将流中的元素进行再次加工形成一个新流。这在开发中很有用。比如我们有一个学生集合,我们需要从中提取学生的年龄以分析学生的年龄分布曲线。放在 Java 8 之前 我们要通过新建一个集合然后通过遍历学生集合来消费元素中的年龄属性。现在我们通过很简单的流式操作就完成了这个需求。

示意图:

对应的伪代码:

// 伪代码

List ages=studentList.stream().map(Student::getAge).collect(Collectors.toList());

3. flatMap 操作

通过上面的例子,map 操作应该非常好理解。那么 flatMap 是干嘛的呢? 这样我们把上面的例子给改一下,如果是以班级为单位,提取所有班级下的所有学生的年龄以分析学生的年龄分布曲线。这时我们使用上面的方法还行得通吗?

List> studentGroup= gradeList.stream().map(Grade::getStudents).collect(Collectors.toList());

通过上面的一顿操作,我们只能得到每个班的学生集合的集合 List>。 我们还需要嵌套循环才能获取学生的年龄数据,十分不便。如果我们能返回全部学生的集合就方便多了。 没错!flatMap 可以搞定!

// flatMap 提取 List map 提取年龄

List ages = grades.stream().flatMap(grade -> grade.getStudents().stream()).map(Student::getAge).collect(Collectors.toList());

正如上面的伪代码所示,我们使用 flatMap 将所有的学生汇聚到一起。然后再使用 map 操作提取年龄。 flatMap 不同于 map 地方在于 map 只是提取属性放入流中,而 flatMap 先提取属性放入一个比较小的流,然后再将所有的流合并为一个流。有一种 “聚沙成塔” 的感觉。

再画一张图来加深理解:

4. 总结

map 操作和 flatMap 操作一旦你熟悉了,可以非常简便地解决一些数据流的操作问题。扩展一下知识,其实Java 8 中 不光 Stream 中存在这两种操作,其实 Optional

中也存在这两种操作,作用都差不多。

关注微信公众号:Felordcn 获取更多干货

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/412091.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

string和byte[]的相互转换

string --> byte[]byte[] dataSyste.Text.Encoding.ASCII.GetBytes(string);byte[]-->stringstring string1 Encoding.ASCII.GetString( bytes, 0, bytesSize );如果有中文字符把Encoding.ASCII换成Encoding.GetEncoding("gb2312") 转载于:https://www.cnblogs…

imagemagick for java_ImageMagick使用for java(im4java)

简介:用于读、写、处理图片文件,支持89种格式的图片文件,利用imageMagick可以根据web应用程序动态生成图片,也可以将一个或者一组图片改变大小、旋转、锐化、减色、增加特效等操作,并对操作结果进行保存(可以设置保存格…

[收藏]网络营销十道羊皮卷

羊皮卷之一:一个与企业名称和形象相符的域名,是企业进行网络营销的前提。由于域名具有唯一性,一个域名一旦注册成功,任何其他机构都无法注册相同的域名。因此,域名是企业重要的网络商标,在网络营销中起到企…

[vue] 删除数组用delete和Vue.delete有什么区别?

[vue] 删除数组用delete和Vue.delete有什么区别? delete:只是被删除数组成员变为 empty / undefined,其他元素键值不变Vue.delete:直接删了数组成员,并改变了数组的键值(对象是响应式的,确保删除…

Python模块学习

阅读目录 第一篇:Python模块之netmiko 第二篇:Python模块之junos-eznc 第三篇:Python模块之pexpect 第四篇:Python模块之paramiko 第五篇:Python模块之XlsxWriter 第六篇:Python模块之requests,urllib和re …

web文件加密

讲解以及源代码下载ASP.NET 2.0: Encrypting Connection Strings http://blogs.vertigosoftware.com/snyholm/archive/2005/12/16/1746.aspx http://msdn2.microsoft.com/en-us/library/yxw286t2.aspx中文http://msdn2.microsoft.com/zh-cn/library/yxw286t2.aspx ASP.NET 2.0:…

java开发和android开发_浅谈Java开发和Android开发的不同

Java是具有多种用例的完整开发语言,包括Web开发,PC程序开发,嵌入式开发等。Android开发是面向手机应用,使用Java较多,还有常用的H5跨平台混合架构模式。一,UI界面开发不同1)Java Swing现在Java开发基本上都…

[vue] v-model是什么?有什么用呢?

[vue] v-model是什么?有什么用呢? 一则语法糖,相当于v-bind:value"xxx" 和 input,意思是绑定了一个value属性的值,子组件可对value属性监听,通过$emit(input, xxx)的方式给父组件通讯。自己实现…

远程上传下载文件-Xftp5

Xftp5下载 链接:https://pan.baidu.com/s/1Wzso_Q7mPy5uGOUlripEWg 密码:xfx9 安装选择家庭版 由于21端口没有开,所以不能选FTP, 选择SFTP,22端口 用哪个用户登录机会自动到该用户的家目录 连接上出先乱码问题 属性 OK. 转载于:h…

java反射 pdf_java反射学习笔记整理.pdf

java反射学习笔记整理.pdf还剩15页未读,继续阅读下载文档到电脑,马上远离加班熬夜!亲,很抱歉,此页已超出免费预览范围啦!如果喜欢就下载吧,价低环保!内容要点:Java 反射笔…

变态跳台阶

题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。题解 简要提炼思路: 1、有n个台阶,则每次可以跳1,2,3,,,n个…

[vue] 动态给vue的data添加一个新的属性时会发生什么?怎样解决?

[vue] 动态给vue的data添加一个新的属性时会发生什么?怎样解决? 如果在实例创建之后添加新的属性到实例上,它不会触发视图更新。如果想要使添加的值做到响应式,应当使用$set()来添加对象。个人简介 我是歌谣,欢迎和大…

Python学习 :面向对象 -- 成员修饰符

成员修饰符 两种成员 - 公有成员 - 私有成员, __字段名 - 无法直接访问,只能通过内部方法来间接访问私有成员 简例:公有成员与私有成员 class Info:country 中国 # 静态字段 __gender 男 # 静态字段私有化def __init__(self,name,age):self.nam…

[vue] SPA首屏加载速度慢的怎么解决?

[vue] SPA首屏加载速度慢的怎么解决? 1.通过Gzip压缩 2.使用路由懒加载 3.利用webpack中的externals这个属性把打包后不需要打包的库文件都分离出去,减小项目打包后的大小 4.使用SSR渲染个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放…

Visual Basic .NET处理Excle表格全接触

Visual Basic .Net处理Excel表格机理和处理Word文档一样,也是通过互操作,引入COM组件来实现的,所以前提条件是运行本文中介绍的程序的计算机必须安装Office 2000中的Excel软件。如果计算机安装的Office 2000,那么这个COM组件就是M…

java读文件几种方式_Java读取文件的几种方式

import java.io.*;public class ReadFromFile {/*** 以字节为单位读取文件,常用于读二进制文件,如图片、声音、影像等文件。*/public static void readFileByBytes(String fileName) {File file new File(fileName);InputStream in null;try {System.o…

Django-视图层

视图函数 视图函数,简称视图,是一个简单的Python 函数,它接受Web请求并且返回Web响应。 无论视图本身包含什么逻辑,都要返回响应 请求对象 urls.py from django.contrib import admin from django.urls import path,re_pathfrom a…

aspnet_UsersInRoles_GetUsersInRoles

ALTERPROCEDUREdbo.aspnet_UsersInRoles_GetUsersInRoles --查询某角色的用户ApplicationNameNVARCHAR(256), RoleNameNVARCHAR(256)ASBEGINDECLAREApplicationIdUNIQUEIDENTIFIERSELECTApplicationIdNULLSELECTApplicationIdApplicationId FROMaspnet_Applications WHERELO…

[vue] 你认为vue的核心是什么?

[vue] 你认为vue的核心是什么? 两部分 一部分 数据->虚拟dom->dom, 另一部分 响应式数据 这两部分大大节省了开发者对数据变动转换到页面显示的操作,可以让开发者聚焦业务,聚焦数据的处理。个人简介 我是歌谣,欢迎和大家一…

java keyadapter_在java中使用keyAdapter和keyEvent时出错

我是编程的初学者,我一直在研究一个小项目,众所周知的叫做Tetris的游戏,我遇到了这个小问题,我希望你能帮助我解。我导入了:import java.awt.event.KeyAdapter和 import java.awt.event.KeyEvent能够使用我的键盘玩游戏…