一、前言
在日常的开发工作中经常碰到要处理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中怎么办?
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<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:st