Java8 stream流的map()方法你会使用了吗
一、前言
在日常的开发工作中经常碰到要处理list中数据的问题,比如从数据库中查出了很多学生,由于一些原因需要在内存中找出这些学生中的所有姓名,或者把名为“王五”的语文成绩暂时修改为“100”,这些问题怎么处理呐,之前我们想到的是遍历每个元素,然后取出来放到另外一个集合中,在java8中对集合可以进行流式操作使上面的处理更简洁。今天来看下map()方法的使用。
二、概述
stram流式处理中有map方法,先看下其定义,该方法在java.util.stream.Stream类中,
可以看到map()方法接收一个函数式接口参数,入参有一个T,返回一个Stream流,这个流是R泛型。主要有以下几点注意,
- 入参是一个流中的元素;
- 出参是一个流,且流中是新元素;
用图表示就是下面的样子,原始流中有四个圆形图案,调用map()函数后变成了四个五角星图案,这里的圆形图案和五角星图案是一一对应的,也就是原始流中有多少个元素,调用map()方法后依旧有多少个元素,唯一改变的是流中的元素类型。
好了,下面看下怎么使用map()函数。
三、详述
以Student为例,
Student.java
package com.example.log.stream.entity; import java.io.Serializable; /** * 学生类 * @date 2022/11/30 20:40 */ public class Student implements Serializable { /** * 姓名 */ private String name; /** * 班级 */ private String schoolClass; /** *语文成绩 */ private Integer chineseScore; /** * 数学成绩 */ private Integer MathScore; //省略get、set方法 }
有一个初始化数据的类,用来初始化一个List
Data.java
package com.example.log.stream.test; import com.example.log.stream.entity.Student; import java.util.ArrayList; import java.util.List; /** * @date 2022/11/30 22:43 */ public class Data { public static List<Student> initData(){ List<Student> students= new ArrayList<>(); Student s1=new Student(); s1.setName("王五"); s1.setSchoolClass("一年级"); s1.setChineseScore(100); s1.setMathScore(100); students.add(s1); Student s2=new Student(); s2.setName("李四"); s2.setSchoolClass("一年级"); s2.setChineseScore(100); s2.setMathScore(100); students.add(s2); Student s3=new Student(); s3.setName("李思"); s3.setSchoolClass("二年级"); s3.setChineseScore(100); s3.setMathScore(100); students.add(s3); Student s4=new Student(); s4.setName("王五"); s4.setSchoolClass("三年级"); s4.setChineseScore(100); s4.setMathScore(100); students.add(s4); Student s5=new Student(); s5.setName("赵三"); s5.setSchoolClass("一年级"); s5.setChineseScore(100); s5.setMathScore(100); students.add(s5); return students; } }
下面根据上面的数据,进行下面的操作。
3.1、找出所有的学生姓名
TestMap.java
package com.example.log.stream.test; import com.example.log.stream.entity.Student; import java.util.ArrayList; import java.util.List; /** * 测试map方法 * @date 2022/11/30 21:25 */ public class TestMap { public static void main(String[] args) { List<Student> students=Data.initData(); students.stream().map(student -> student.getName()).forEach(System.out::println); } }
这里使用了map()方法,入参是Student,出参是以String为泛型的流,最后使用forEach进行了打印,看下结果
可以看到刚好把所有的学生姓名均打印出来了。如果想把这些学生姓名放到一个List中怎么办?
将学生姓名放到list中
package com.example.log.stream.test; import com.example.log.stream.entity.Student; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; /** * 测试map方法 * * @author wangcj5 * @date 2022/11/30 21:25 */ public class TestMap { public static void main(String[] args) { List<Student> students=Data.initData(); // students.stream().map(student -> student.getName()).forEach(System.out::println); //将所有的学生姓名放到list中 List<String> studentNames=students.stream().map(student -> student.getName()).collect(Collectors.toList()); for (String studentName:studentNames) { System.out.println(studentName); } } }
结果如下
同样的找出所有的班级,找出所有学生的成绩都可类比上面的,可以看到打印出的学生姓名或班级是有重复数据,这个要怎么解决。我们知道在最后是把数据放到list中,为了解决重复的问题可以把数据放到set中,利用set的去重功能,
//将学生姓名放到Set中,可以实现去重功能 Set<String> studentNames=students.stream().map(student -> student.getName()).collect(Collectors.toSet());
结果不再打印,有兴趣的可以自己试试。
3.2、将姓名为“赵三”的语文成绩置为90
现在有这样一个需求,要把姓名为“赵三”学生的语文成绩置为90,看下利用map()函数怎么做?
TestMap2.java
package com.example.log.stream.test; import com.example.log.stream.entity.Student; import java.util.List; import java.util.Set; import java.util.stream.Collectors; /** * 测试map方法 * @date 2022/11/30 21:25 */ public class TestMap2 { public static void main(String[] args) { List<Student> students = Data.initData(); List<Student> studentNames = students.stream().map(student -> { if ("赵三".equals(student.getName())) { student.setChineseScore(90); } return student; }).collect(Collectors.toList()); for (Student studentName : studentNames) { System.out.println(studentName); } //打印老的list System.out.println("改之前的数据----------------"); for (Student studentName : students) { System.out.println(studentName); } } }
看下打印的结果 ,
从上面的结果中可以看出,”赵三“的语文成绩的确被改为了”90“,这点是没错的。再看原数据也被改为了”90“,上面不是提到map()方法生成的是一个新流,原始流中的数据也被修改了,因为下面这行代码是在原始流中元素的基础上修改的引用类型中的数据,导致的原始流中的数据也会改
map()方法的本意是不会对原始流中的元素造成影响,那么只要new一个对象,返回即可了。现在想找出一年级学生的成绩,用map()能实现吗?
3.3、找出一年级学生的成绩
试着去使用map()方法找出所有一年级学生的成绩,发现无法实现,因为map()方法强调原始流中的元素和新流中元素的个数要相同,或者理解为一一对应,原始流中有5个学生,而要实现的目标流中一年级学生仅有3个,所以使用map()方法无法完成该功能。应该使用什么方法,下期揭晓。
四、总结
java8的stream流map()方法是将流中的元素转换为另外一个流中的元素,转换前后两个流的元素个数不发生改变。
到此这篇关于Java8 stream流的map()方法你会使用了吗的文章就介绍到这了,更多相关Java8 stream map方法内容请搜索猪先飞以前的文章或继续浏览下面的相关文章希望大家以后多多支持猪先飞!
原文出处:https://www.cnblogs.com/teach/p/16940103.html
相关文章
Java8 实现stream将对象集合list中抽取属性集合转化为map或list
这篇文章主要介绍了Java8 实现stream将对象集合list中抽取属性集合转化为map或list的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-05- 这篇文章主要介绍了java8如何用Stream查List对象某属性是否有重复的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-11
java8中的Collectors.groupingBy用法详解
这篇文章主要介绍了java8中的Collectors.groupingBy用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-03-17解决:failed to open stream: No such file or directory in
本教程来给各位同学介绍failed to open stream: No such file or directory in解决办法,有需要了解的朋友可进入参考。 Warning: include_once(./include/main.i...2016-11-25- 这篇文章主要介绍了Java8处理List的双层循环问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-08-19
- 这篇文章主要介绍了使用list stream:任意对象List拼接字符串操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-09
浅谈Java8 的foreach跳出循环break/return
这篇文章主要介绍了Java8 的foreach跳出循环break/return,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-07-28Java 8 Stream 的终极技巧——Collectors 功能与操作方法详解
这篇文章主要介绍了Java 8 Stream Collectors 功能与操作方法,结合实例形式详细分析了Java 8 Stream Collectors 功能、操作方法及相关注意事项,需要的朋友可以参考下...2020-05-20JavaScript中的数组遍历forEach()与map()方法以及兼容写法介绍
下面小编就为大家带来一篇JavaScript中的数组遍历forEach()与map()方法以及兼容写法介绍。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-05-20- 这篇文章主要介绍了Java8 使用流抽取List<T>集合中T的某个属性操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-05
- 这篇文章主要介绍了c#之FileStream对象读写大文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
- map容器是C++ STL中的重要一员,删除map容器中value为指定元素的问题是我们经常与遇到的一个问题,下面这篇文章主要给大家介绍了关于利用C++如何删除map容器中指定值的元素的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。...2020-04-25
- 这篇文章主要介绍了JavaScript WeakMap使用的详细介绍,帮助大家更好的理解和使用JavaScript,感兴趣的朋友可以了解下...2021-02-06
java中JSONObject转换为HashMap(方法+main方法调用实例)
这篇文章主要介绍了java中JSONObject转换为HashMap(方法+main方法调用实例),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-14- 这篇文章主要介绍了解决jmap命令打印JVM堆信息异常的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-12-04
java8时间 yyyyMMddHHmmss格式转为日期的代码
这篇文章主要介绍了java8时间 yyyyMMddHHmmss格式转为日期的代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-09-17- 这篇文章主要介绍了mybatis Map查询结果下划线转驼峰的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-09-24
- 相信大家现在都知道微信小程序吧,下面这篇文章主要给大家介绍了微信小程序开发之map地图的相关资料,分享出来供大家参考学习,文中通过示例代码介绍的非常详细,需要的朋友们下面跟着小编来一起学习学习吧。...2017-06-15
- 这篇文章主要分享了个人使用C# FileStream实现的读写的文本操作的小程序,主要是复习下对filestream的理解,希望对大家学习C#能够有所帮助...2020-06-25
- 测试代码如下:复制代码 代码如下:<?php$fp=fopen("http://www.sina.com.cn", 'r');$stream_meta = stream_get_meta_data($fp);print_r($stream_meta);?>在我本机输出如下:Array( [wrapper_data] => Array...2013-10-04