Java8 stream流的map()方法你会使用了吗

 更新时间:2022年12月01日 14:32:57   作者:良工说技术  
在日常的开发工作中经常碰到要处理list中数据的问题。本文主要带大家了解下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方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Java编程的Observer观察者设计模式

    详解Java编程的Observer观察者设计模式

    这篇文章主要介绍了Java编程的Observer观察者设计模式,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对象,需要的朋友可以参考下
    2016-01-01
  • Spring之Scope注解使用详解

    Spring之Scope注解使用详解

    spring的bean管理中,每个bean都有对应的scope。在BeanDefinition中就已经指定scope,默认的RootBeanDefinition的scope是prototype类型,使用@ComponentScan扫描出的BeanDefinition会指定是singleton,最常使用的也是singleton
    2023-02-02
  • Maven优雅的添加第三方Jar包的方法

    Maven优雅的添加第三方Jar包的方法

    下面小编就为大家带来一篇Maven优雅的添加第三方Jar包的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • ResultSet如何动态获取列名和值

    ResultSet如何动态获取列名和值

    这篇文章主要介绍了ResultSet如何动态获取列名和值问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12
  • Seata之分布式事务问题及解决方案

    Seata之分布式事务问题及解决方案

    这篇文章主要介绍了Seata之分布式事务问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • Springboot使用sharedingjdbc实现分库分表

    Springboot使用sharedingjdbc实现分库分表

    这篇文章主要介绍了Springboot使用sharedingjdbc实现分库分表,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Java的内存区域与内存溢出异常你了解吗

    Java的内存区域与内存溢出异常你了解吗

    这篇文章主要为大家详细介绍了Java的内存区域与内存溢出异常,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • Lombok的@Accessors使用说明

    Lombok的@Accessors使用说明

    这篇文章主要介绍了Lombok的@Accessors使用说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • Spring boot 整合CXF开发web service示例

    Spring boot 整合CXF开发web service示例

    这篇文章主要介绍了Spring boot 整合CXF开发web service示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Java值传递和引用传递详解

    Java值传递和引用传递详解

    这篇文章主要为大家详细介绍了Java值传递和引用传递,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12

最新评论