0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Java8的Stream流 map() 方法

科技绿洲 来源:了不起 作者:了不起 2023-09-25 11:06 次阅读

前言

在日常的开发工作中经常碰到要处理 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< Student > initData(){
        List< Student > 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< String > studentNames = DataFactory.initData().stream()
        .map(student - > student.getName())
        .collect(Collectors.toList());
    for (String studentName : studentNames) {
        System.out.println(studentName);
    }
}

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

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

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

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

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

public static void main(String[] args) {
    List< Student > students = DataFactory.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() 方法生成的是一个新流,原始流中的数据也被修改了,因为下面这行代码是在原始流中元素的基础上修改的引用类型中的数据,导致的原始流中的数据也会改。

总结

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口
    +关注

    关注

    33

    文章

    7648

    浏览量

    148522
  • 数据
    +关注

    关注

    8

    文章

    6514

    浏览量

    87609
  • JAVA
    +关注

    关注

    19

    文章

    2904

    浏览量

    103001
  • 函数
    +关注

    关注

    3

    文章

    3904

    浏览量

    61311
  • Stream
    +关注

    关注

    0

    文章

    20

    浏览量

    7923
收藏 人收藏

    评论

    相关推荐

    Java基础-Stream-04-Stream终结方法详解

    JAVA
    电子学习
    发布于 :2022年12月30日 14:11:08

    Java基础教程Java入门到精通day23_19_Stream中间操作之map

    JAVA
    电子学习
    发布于 :2023年01月13日 12:34:05

    JAVA学习直通车(教程+书籍+100个实例+问题与解答)

    对于Java8的并行并不陌生,没错,我们常常用它来执行并行任务,但是由于并行(parallel stream)采用的是享线程池,可能会对我们的性能造成严重影响,那怎么处理呢?`
    发表于 10-25 14:35

    java8新特性

    java8为接口声明添加非抽象方法的实现,也成为拓展方法
    发表于 11-27 15:54 1620次阅读

    Java Map的几种循环方式学习总结

    本文档内容介绍了基于Java Map的几种循环方式学习总结,供参考
    发表于 03-19 15:51 0次下载

    Java并行流存在的问题及解决办法详解

    对于从事Java开发的童鞋来说,相信对于Java8的并行流并不陌生,没错,我们常常用它来执行并行任务,但是由于并行流(parallel stream)采用的是享线程池,可能会对我们的性能造成严重影响,那怎么处理呢?
    发表于 04-03 15:55 12次下载

    如何利用Stream API来优化Java代码

    使用Stream API优化代码 Java8的新特性主要是Lambda表达式和流,当流和Lambda表达式结合起来一起使用时,因为流申明式处理数据集合的特点,可以让代码变得简洁易读 放大
    的头像 发表于 07-26 14:30 1142次阅读

    JAVA8提供了Optional类来优化这种写法

    这种写法是比较丑陋的,为了避免上述丑陋的写法,让丑陋的设计变得优雅。JAVA8提供了Optional类来优化这种写法,接下来的正文部分进行详细说明
    的头像 发表于 04-24 15:18 853次阅读

    JDK8 Stream数据流效率分析

    StreamJava SE 8类库中新增的关键抽象,它被定义于 java.util.stream (这个包里有若干流类型:Stream 代表对象引用流,此外还有一系列特化流,
    的头像 发表于 08-17 10:53 972次阅读

    javastream编程调试技巧

      javastream编程给调试带来了极大的不便,idea 推出了streamtrace功能,可以详细看到每一步操作的关系、结果,非常方便进行调试。初遇StreamTrace这里简单将字符串转成它的字符数,并设置断点开启debug模式。
    的头像 发表于 10-11 11:06 1317次阅读

    怎么使用Java8Stream API比较两个List的差异呢?

    可以使用Java8Stream API来比较两个List的差异,并取出不同的对象。
    的头像 发表于 08-12 11:15 1586次阅读

    List 转 Map方法

    ; // 构造函数 、 get 、 set } 我们假定 id 字段 是唯一的, 所以我们把 id 作为 Map 的key。 使用 Java 8 之前的方法 在使用Java 8 之前,
    的头像 发表于 10-09 16:10 807次阅读

    Java8的新特性

    虽然目前Java最新版本都已经到16了,但是绝大部分公司目前用的Java版本都是8,想当初Java8问世后,其Lambda表达式与方法引用可是最亮眼的新特性,目前,这两个特性也被大家广
    的头像 发表于 10-10 17:12 307次阅读

    JavaStream的常用知识

    ?我们都知道,传统的处理中,每一步我们都需要通过循环控制,逻辑控制,解包,重新装箱这些工作。 非生产线示意处理图 这些步骤让我们的程序的业务逻辑支离破碎,经常处理数据类的小伙伴尤为痛苦。幸运的是,Java8为我们引入了Stream,使用
    的头像 发表于 10-11 15:45 256次阅读
    <b class='flag-5'>Java</b>的<b class='flag-5'>Stream</b>的常用知识

    为什么需要Streams?它们能取代Java中的for循环吗?

    Java8的发布是Java历史上的一个重大时刻。Streams 和 Lambda 被引入,它们现在被广泛使用。
    的头像 发表于 11-03 09:39 253次阅读
    为什么需要Streams?它们能取代<b class='flag-5'>Java</b>中的for循环吗?