这么简单,还不会使用java8 stream流的map()方法吗?
创始人
2024-03-15 01:31:42
0

一、前言

在日常的开发工作中经常碰到要处理list中数据的问题,比如从数据库中查出了很多学生,由于一些原因需要在内存中找出这些学生中的所有姓名,或者把名为“王五”的语文成绩暂时修改为“100”,这些问题怎么处理呐,之前我们想到的是遍历每个元素,然后取出来放到另外一个集合中,在java8中对集合可以进行流式操作使上面的处理更简洁。今天来看下map()方法的使用。

二、概述

stram流式处理中有map方法,先看下其定义,该方法在java.util.stream.Stream类中,

可以看到map()方法接收一个函数式接口参数,入参有一个T,返回一个Stream流,这个流是R泛型。主要有以下几点注意,

  1. 入参是一个流中的元素;
  2. 出参是一个流,且流中是新元素;

用图表示就是下面的样子,原始流中有四个圆形图案,调用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 initData(){List 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 students=Data.initData();students.stream().map(student -> student.getName()).forEach(System.out::println);}}

这里使用了map()方法,入参是Student,出参是以String为泛型的流,最后使用forEach进行了打印,看下结果

可以看到刚好把所有的学生姓名均打印出来了。如果想把这些学生姓名放到一个List中怎么办?

3.1.1、将学生姓名放到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 students=Data.initData();
//        students.stream().map(student -> student.getName()).forEach(System.out::println);//将所有的学生姓名放到list中List studentNames=students.stream().map(student -> student.getName()).collect(Collectors.toList());for (String studentName:studentNames) {System.out.println(studentName);}}
}

结果如下,

同样的找出所有的班级,找出所有学生的成绩都可类比上面的,可以看到打印出的学生姓名或班级是有重复数据,这个要怎么解决。我们知道在最后是把数据放到list中,为了解决重复的问题可以把数据放到set中,利用set的去重功能,

//将学生姓名放到Set中,可以实现去重功能
Set 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 students = Data.initData();List 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);}//打印老的listSystem.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()方法是将流中的元素转换为另外一个流中的元素,转换前后两个流的元素个数不发生改变。

有不正之处,欢迎指正,谢谢!

相关内容

热门资讯

保存时出现了1个错误,导致这篇... 当保存文章时出现错误时,可以通过以下步骤解决问题:查看错误信息:查看错误提示信息可以帮助我们了解具体...
汇川伺服电机位置控制模式参数配... 1. 基本控制参数设置 1)设置位置控制模式   2)绝对值位置线性模...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
表格中数据未显示 当表格中的数据未显示时,可能是由于以下几个原因导致的:HTML代码问题:检查表格的HTML代码是否正...
本地主机上的图像未显示 问题描述:在本地主机上显示图像时,图像未能正常显示。解决方法:以下是一些可能的解决方法,具体取决于问...
表格列调整大小出现问题 问题描述:表格列调整大小出现问题,无法正常调整列宽。解决方法:检查表格的布局方式是否正确。确保表格使...
不一致的条件格式 要解决不一致的条件格式问题,可以按照以下步骤进行:确定条件格式的规则:首先,需要明确条件格式的规则是...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...