Java8?stream流的map()方法你會使用了嗎
一、前言
在日常的開發(fā)工作中經(jīng)常碰到要處理list中數(shù)據(jù)的問題,比如從數(shù)據(jù)庫中查出了很多學(xué)生,由于一些原因需要在內(nèi)存中找出這些學(xué)生中的所有姓名,或者把名為“王五”的語文成績暫時修改為“100”,這些問題怎么處理吶,之前我們想到的是遍歷每個元素,然后取出來放到另外一個集合中,在java8中對集合可以進(jìn)行流式操作使上面的處理更簡潔。今天來看下map()方法的使用。
二、概述
stram流式處理中有map方法,先看下其定義,該方法在java.util.stream.Stream類中,

可以看到map()方法接收一個函數(shù)式接口參數(shù),入?yún)⒂幸粋€T,返回一個Stream流,這個流是R泛型。主要有以下幾點(diǎn)注意,
- 入?yún)⑹且粋€流中的元素;
- 出參是一個流,且流中是新元素;
用圖表示就是下面的樣子,原始流中有四個圓形圖案,調(diào)用map()函數(shù)后變成了四個五角星圖案,這里的圓形圖案和五角星圖案是一一對應(yīng)的,也就是原始流中有多少個元素,調(diào)用map()方法后依舊有多少個元素,唯一改變的是流中的元素類型。

好了,下面看下怎么使用map()函數(shù)。
三、詳述
以Student為例,
Student.java
package com.example.log.stream.entity;
import java.io.Serializable;
/**
* 學(xué)生類
* @date 2022/11/30 20:40
*/
public class Student implements Serializable {
/**
* 姓名
*/
private String name;
/**
* 班級
*/
private String schoolClass;
/**
*語文成績
*/
private Integer chineseScore;
/**
* 數(shù)學(xué)成績
*/
private Integer MathScore;
//省略get、set方法
}有一個初始化數(shù)據(jù)的類,用來初始化一個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;
}
}下面根據(jù)上面的數(shù)據(jù),進(jìn)行下面的操作。
3.1、找出所有的學(xué)生姓名
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()方法,入?yún)⑹荢tudent,出參是以String為泛型的流,最后使用forEach進(jìn)行了打印,看下結(jié)果

可以看到剛好把所有的學(xué)生姓名均打印出來了。如果想把這些學(xué)生姓名放到一個List中怎么辦?
將學(xué)生姓名放到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);
//將所有的學(xué)生姓名放到list中
List<String> studentNames=students.stream().map(student -> student.getName()).collect(Collectors.toList());
for (String studentName:studentNames) {
System.out.println(studentName);
}
}
}結(jié)果如下

同樣的找出所有的班級,找出所有學(xué)生的成績都可類比上面的,可以看到打印出的學(xué)生姓名或班級是有重復(fù)數(shù)據(jù),這個要怎么解決。我們知道在最后是把數(shù)據(jù)放到list中,為了解決重復(fù)的問題可以把數(shù)據(jù)放到set中,利用set的去重功能,
//將學(xué)生姓名放到Set中,可以實現(xiàn)去重功能 Set<String> studentNames=students.stream().map(student -> student.getName()).collect(Collectors.toSet());
結(jié)果不再打印,有興趣的可以自己試試。
3.2、將姓名為“趙三”的語文成績置為90
現(xiàn)在有這樣一個需求,要把姓名為“趙三”學(xué)生的語文成績置為90,看下利用map()函數(shù)怎么做?
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("改之前的數(shù)據(jù)----------------");
for (Student studentName : students) {
System.out.println(studentName);
}
}
}看下打印的結(jié)果 ,

從上面的結(jié)果中可以看出,”趙三“的語文成績的確被改為了”90“,這點(diǎn)是沒錯的。再看原數(shù)據(jù)也被改為了”90“,上面不是提到map()方法生成的是一個新流,原始流中的數(shù)據(jù)也被修改了,因為下面這行代碼是在原始流中元素的基礎(chǔ)上修改的引用類型中的數(shù)據(jù),導(dǎo)致的原始流中的數(shù)據(jù)也會改

map()方法的本意是不會對原始流中的元素造成影響,那么只要new一個對象,返回即可了?,F(xiàn)在想找出一年級學(xué)生的成績,用map()能實現(xiàn)嗎?
3.3、找出一年級學(xué)生的成績
試著去使用map()方法找出所有一年級學(xué)生的成績,發(fā)現(xiàn)無法實現(xiàn),因為map()方法強(qiáng)調(diào)原始流中的元素和新流中元素的個數(shù)要相同,或者理解為一一對應(yīng),原始流中有5個學(xué)生,而要實現(xiàn)的目標(biāo)流中一年級學(xué)生僅有3個,所以使用map()方法無法完成該功能。應(yīng)該使用什么方法,下期揭曉。
四、總結(jié)
java8的stream流map()方法是將流中的元素轉(zhuǎn)換為另外一個流中的元素,轉(zhuǎn)換前后兩個流的元素個數(shù)不發(fā)生改變。
到此這篇關(guān)于Java8 stream流的map()方法你會使用了嗎的文章就介紹到這了,更多相關(guān)Java8 stream map方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springboot使用sharedingjdbc實現(xiàn)分庫分表
這篇文章主要介紹了Springboot使用sharedingjdbc實現(xiàn)分庫分表,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
Java的內(nèi)存區(qū)域與內(nèi)存溢出異常你了解嗎
這篇文章主要為大家詳細(xì)介紹了Java的內(nèi)存區(qū)域與內(nèi)存溢出異常,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-03-03
Spring boot 整合CXF開發(fā)web service示例
這篇文章主要介紹了Spring boot 整合CXF開發(fā)web service示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-05-05

