一、前言

在日常的开发工作中经常碰到要处理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<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;
}
}

下面根据上面的数据,进行下面的操作。

2.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中怎么办?

2.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:studentNames) {
System.out.println(studentName);
}
}
}

结果如下,

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

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

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

2.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()能实现吗?

2.3、找出一年级学生的成绩

试着去使用map()方法找出所有一年级学生的成绩,发现无法实现,因为map()方法强调原始流中的元素和新流中元素的个数要相同,或者理解为一一对应,原始流中有5个学生,而要实现的目标流中一年级学生仅有3个,所以使用map()方法无法完成该功能。应该使用什么方法,下期揭晓。

四、总结

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

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

感谢关注我的公众号【良工说技术】,更多精彩。

这么简单,还不会使用java8 stream流的map()方法吗?的更多相关文章

  1. 【转】Java8 Stream 流详解

      当我第一次阅读 Java8 中的 Stream API 时,说实话,我非常困惑,因为它的名字听起来与 Java I0 框架中的 InputStream 和 OutputStream 非常类似.但是 ...

  2. Java8 - Stream流:让你的集合变得更简单!

    前段时间,在公司熟悉新代码,发现好多都是新代码,全是 Java8语法,之前没有了解过,一直在专研技术的深度,却忘了最初的语法,所以,今天总结下Stream ,算是一份自己理解,不会很深入,就讲讲常用的 ...

  3. Java8 Stream流

    第三章 Stream流 <Java8 Stream编码实战>的代码全部在https://github.com/yu-linfeng/BlogRepositories/tree/master ...

  4. 使用Java8 Stream API对Map按键或值进行排序

    一.什么是Java 8 Stream 使用Java 8 Streams,我们可以按键和按值对映射进行排序.下面是它的工作原理: 将Map或List等集合类对象转换为Stream对象 使用Streams ...

  5. Java8——Stream流式操作的一点小总结

    我发现,自从我学了Stream流式操作之后,工作中使用到的频率还是挺高的,因为stream配合着lambda表达式或者双冒号(::)使用真的是优雅到了极致!今天就简单分(搬)享(运)一下我对strea ...

  6. 关于Java8 Stream流的利与弊 Java初学者,大神勿喷

    题目需求: 1:第一个队伍只要名字为3个字成员的姓名,存储到新集合 2:第一个队伍筛选之后只要前3人:存储到一个新集合 3:第2个队伍只要姓张的成员姓名:存储到一个新集合 4:第2个队伍不要前2人,存 ...

  7. Java8 Stream流API常用操作

    Java版本现在已经发布到JDK13了,目前公司还是用的JDK8,还是有必要了解一些JDK8的新特性的,例如优雅判空的Optional类,操作集合的Stream流,函数式编程等等;这里就按操作例举一些 ...

  8. 【JDK8】Java8 Stream流API常用操作

    Java版本现在已经发布到JDK13了,目前公司还是用的JDK8,还是有必要了解一些JDK8的新特性的,例如优雅判空的Optional类,操作集合的Stream流,函数式编程等等;这里就按操作例举一些 ...

  9. Java_lambda表达式之"stream流学习,Map学习,collect学习,Conllectors工具类学习"

    Lambda表达式学习 对List<Integer> userIdList = UserList.stream().map(User::getUserId).collect(Collect ...

  10. Java8 Stream流方法

    流是Java API的新成员,它允许以声明性方式处理数据集合(通过查询语句来表达,而不是临时编写一个实现).就现在来说,可以把它们看成遍历数据集的高级迭代器.此外,流还可以透明地并行处理,无需写任何多 ...

随机推荐

  1. MQ的消息丢失/重复/积压的问题解决

    在我们实际的开发过程中,我们肯定会用到MQ中间件,常见的MQ中间件有kafka,RabbitMQ,RocketMQ.在使用的过程中,我们必须要考虑这样一个问题,在使用MQ的时候,我们怎么确保消息100 ...

  2. 第六章:Django 综合篇 - 13:发送邮件

    在Python中已经内置了一个smtp邮件发送模块,Django在此基础上进行了简单地封装,让我们在Django环境中可以更方便更灵活的发送邮件. 所有的功能都在django.core.mail中. ...

  3. 五、frp内网穿透客户端frpc.ini各配置参数详解

    [必须]标识头[common]是不可或缺的部分 [必须]frps服务端IPserver_addr = 0.0.0.00.0.0.0为FRP服务端IP,客户端要填写为服务端已配置的对应的IP,或者是服务 ...

  4. Elasticsearch:inverted index,doc_values及source

    以后会用到的相关知识:索引中某些字段禁止搜索,排序等操作 当我们学习Elasticsearch时,经常会遇到如下的几个概念: Reverted index doc_values source? 这个几 ...

  5. 第2篇----Istio架构概述篇

    Istio的工作机制 Istio的工作机制和架构,分为控制面和数据面两部分.控制面主要包括Pilot.Mixer.Citadel等服务组件:数据面由伴随每个应用程序部署的代理程序Envoy组成,执行针 ...

  6. mysqld_exporter参数信息

    [root@database03 mysqld_exporter]# ./mysqld_exporter --help usage: mysqld_exporter [<flags>] F ...

  7. 几篇关于MySQL数据同步到Elasticsearch的文章---第五篇:logstash-input-jdbc实现mysql 与elasticsearch实时同步深入详解

    文章转载自: https://blog.csdn.net/laoyang360/article/details/51747266 引言: elasticsearch 的出现使得我们的存储.检索数据更快 ...

  8. Grafana 入门知识介绍

    通过[Configuration]>[Plugins]添加插件 通过[Configuration]>[Data Sources]添加数据源(分析对象) 通过[Server Admin]&g ...

  9. 工作7年收集到的git命令

    概念 git 中的术语解释: 仓库也叫版本库(repository) stage:暂存区,add 后会存到暂存区,commit 后提交到版本库 git 安装 linux 下安装 git 第一种方法:y ...

  10. 文件内再分类到各txt文件

    当老师叫我们帮他做事,比如文件内内容再分类,我们就可以建个面板,里面有各要导入文件按钮,先把分类内容copy下,再点按钮导入进txt文件就行啦. 以下为java代码,使用了tableLayout布局 ...