简单易用,还不会使用Stream流的map()方法吗

哈喽,大家好,我是指北君。

创新互联专注为客户提供全方位的互联网综合服务,包含不限于网站设计、成都网站设计、赣县网络推广、小程序定制开发、赣县网络营销、赣县企业策划、赣县品牌公关、搜索引擎seo、人物专访、企业宣传片、企业代运营等,从售前售中售后,我们都将竭诚为您服务,您的肯定,是我们最大的嘉奖;创新互联为所有大学生创业者提供赣县建站搭建服务,24小时服务热线:18982081108,官方网址:www.cdcxhl.com

Stream API 是Java8中新加入的功能,现在都 Java20 了,不会还有人没用过吧?

今天给大家演示一下 Stream API 中的 map() 方法。

前言

在日常的开发工作中经常碰到要处理 List 中数据的问题,比如从一个对象集合中获得对象中的一个属性的集合。之前我们想到的是遍历每个元素,然后取出来放到另外一个集合中,比较繁琐;在 Java8 之后,对集合可以进行 Stream 操作,使上面的处理更简洁。

概述

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

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

  • 入参是一个流中的元素;
  • 出参是一个流,且流中是新元素;

用图表示就是下面的样子,原始流中有四个圆形图案,调用 map() 函数后变成了四个五角星图案,这里的圆形图案和五角星图案是一一对应的,也就是原始流中有多少个元素,调用 map() 方法后依旧有多少个元素,唯一改变的是流中的元素类型。

示例

我们先创建一个实体类 Student.java

@Data
public class Student implements Serializable {
/**
* 姓名
*/
private String name;
/**
* 班级
*/
private String schoolClass;
/**
*语文成绩
*/
private Integer chineseScore;
/**
* 数学成绩
*/
private Integer mathScore;
}

再创建一个初始化数据的类:

public class DataFactory {
public static List initData(){
List list= new ArrayList<>();
Student s1=new Student();
s1.setName("汤霖");
s1.setSchoolClass("小一班");
s1.setChineseScore(87);
s1.setMathScore(95);
list.add(s1);

Student s2=new Student();
s2.setName("李牧唐");
s2.setSchoolClass("小二班");
s2.setChineseScore(98);
s2.setMathScore(97);
list.add(s2);

Student s3=new Student();
s3.setName("顾北辰");
s3.setSchoolClass("二年级");
s3.setChineseScore(89);
s3.setMathScore(94);
list.add(s3);

Student s4=new Student();
s4.setName("言言");
s4.setSchoolClass("小二班");
s4.setChineseScore(100);
s4.setMathScore(90);
list.add(s4);

Student s5=new Student();
s5.setName("大运");
s5.setSchoolClass("小三班");
s5.setChineseScore(96);
s5.setMathScore(100);
list.add(s5);
return list;
}
}

找出所有的学生姓名

public static void main(String[] args) {
DataFactory.initData().stream()
.map(student -> student.getName())
.forEach(System.out::println);
}

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

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

将学生姓名放到list中

public static void main(String[] args) {
//将所有的学生姓名放到list中
List studentNames = DataFactory.initData().stream()
.map(student -> student.getName())
.collect(Collectors.toList());
for (String studentName : studentNames) {
System.out.println(studentName);
}
}

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

//将学生姓名放到Set中,可以实现去重功能
Set studentNames = DataFactory.initData().stream()
.map(student -> student.getName())
.collect(Collectors.toSet());

结果不再打印,有兴趣的可以自己试试。

将姓名为“汤霖”的语文成绩置为90

现在有这样一个需求,要把姓名为汤霖学生的语文成绩置为90,看下利用 map() 函数怎么做?

public static void main(String[] args) {
List students = DataFactory.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);
}
//打印老的list
System.out.println("-----改之前的数据-----");
for (Student studentName : students) {
System.out.println(studentName);
}
}

输出结果:

从上面的结果中可以看出,汤霖的语文成绩的确被改为了90​,这点是没错的。再看原数据也被改为了90,上面提到过 map() 方法生成的是一个新流,原始流中的数据也被修改了,因为下面这行代码是在原始流中元素的基础上修改的引用类型中的数据,导致的原始流中的数据也会改。

总结

Java8 的 Stream 流 map() 方法是将流中的元素转换为另外一个流中的元素,转换前后两个流的元素个数不发生改变。

网页名称:简单易用,还不会使用Stream流的map()方法吗
网站路径:http://www.shufengxianlan.com/qtweb/news19/531269.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联