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

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

好了,下面看下怎么使用map()函數(shù)。
三、詳述
以Student為例,
Student.java
package com.example.log.stream.entity;
import java.io.Serializable;
/**
* 學(xué)生類(lèi)
* @date 2022/11/30 20:40
*/
public class Student implements Serializable {
/**
* 姓名
*/
private String name;
/**
* 班級(jí)
*/
private String schoolClass;
/**
*語(yǔ)文成績(jī)
*/
private Integer chineseScore;
/**
* 數(shù)學(xué)成績(jī)
*/
private Integer MathScore;
//省略get、set方法
}有一個(gè)初始化數(shù)據(jù)的類(lèi),用來(lái)初始化一個(gè)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("一年級(jí)");
s1.setChineseScore(100);
s1.setMathScore(100);
students.add(s1);
Student s2=new Student();
s2.setName("李四");
s2.setSchoolClass("一年級(jí)");
s2.setChineseScore(100);
s2.setMathScore(100);
students.add(s2);
Student s3=new Student();
s3.setName("李思");
s3.setSchoolClass("二年級(jí)");
s3.setChineseScore(100);
s3.setMathScore(100);
students.add(s3);
Student s4=new Student();
s4.setName("王五");
s4.setSchoolClass("三年級(jí)");
s4.setChineseScore(100);
s4.setMathScore(100);
students.add(s4);
Student s5=new Student();
s5.setName("趙三");
s5.setSchoolClass("一年級(jí)");
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;
/**
* 測(cè)試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é)生姓名均打印出來(lái)了。如果想把這些學(xué)生姓名放到一個(gè)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;
/**
* 測(cè)試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é)果如下

同樣的找出所有的班級(jí),找出所有學(xué)生的成績(jī)都可類(lèi)比上面的,可以看到打印出的學(xué)生姓名或班級(jí)是有重復(fù)數(shù)據(jù),這個(gè)要怎么解決。我們知道在最后是把數(shù)據(jù)放到list中,為了解決重復(fù)的問(wèn)題可以把數(shù)據(jù)放到set中,利用set的去重功能,
//將學(xué)生姓名放到Set中,可以實(shí)現(xiàn)去重功能 Set<String> studentNames=students.stream().map(student -> student.getName()).collect(Collectors.toSet());
結(jié)果不再打印,有興趣的可以自己試試。
3.2、將姓名為“趙三”的語(yǔ)文成績(jī)置為90
現(xiàn)在有這樣一個(gè)需求,要把姓名為“趙三”學(xué)生的語(yǔ)文成績(jī)置為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;
/**
* 測(cè)試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é)果中可以看出,”趙三“的語(yǔ)文成績(jī)的確被改為了”90“,這點(diǎn)是沒(méi)錯(cuò)的。再看原數(shù)據(jù)也被改為了”90“,上面不是提到map()方法生成的是一個(gè)新流,原始流中的數(shù)據(jù)也被修改了,因?yàn)橄旅孢@行代碼是在原始流中元素的基礎(chǔ)上修改的引用類(lèi)型中的數(shù)據(jù),導(dǎo)致的原始流中的數(shù)據(jù)也會(huì)改

map()方法的本意是不會(huì)對(duì)原始流中的元素造成影響,那么只要new一個(gè)對(duì)象,返回即可了。現(xiàn)在想找出一年級(jí)學(xué)生的成績(jī),用map()能實(shí)現(xiàn)嗎?
3.3、找出一年級(jí)學(xué)生的成績(jī)
試著去使用map()方法找出所有一年級(jí)學(xué)生的成績(jī),發(fā)現(xiàn)無(wú)法實(shí)現(xiàn),因?yàn)閙ap()方法強(qiáng)調(diào)原始流中的元素和新流中元素的個(gè)數(shù)要相同,或者理解為一一對(duì)應(yīng),原始流中有5個(gè)學(xué)生,而要實(shí)現(xiàn)的目標(biāo)流中一年級(jí)學(xué)生僅有3個(gè),所以使用map()方法無(wú)法完成該功能。應(yīng)該使用什么方法,下期揭曉。
四、總結(jié)
java8的stream流map()方法是將流中的元素轉(zhuǎn)換為另外一個(gè)流中的元素,轉(zhuǎn)換前后兩個(gè)流的元素個(gè)數(shù)不發(fā)生改變。
到此這篇關(guān)于Java8 stream流的map()方法你會(huì)使用了嗎的文章就介紹到這了,更多相關(guān)Java8 stream map方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一個(gè)簡(jiǎn)單的Java文件讀取的進(jìn)度條
這篇文章主要介紹了一個(gè)簡(jiǎn)單的Java文件讀取的進(jìn)度條,寫(xiě)一個(gè)可以使用的?demo,涉及到了文件的相對(duì)路徑問(wèn)題,需要的朋友可以參考下2023-04-04
Java中的HttpServletRequest接口詳細(xì)解讀
這篇文章主要介紹了Java中的HttpServletRequest接口詳細(xì)解讀,是一個(gè)接口,全限定名稱(chēng)為Jakarta.Serclet.http.HttpServletRequest2023-11-11
HttpServletRequest接口是Servlet規(guī)范的一員,需要的朋友可以參考下
SpringMVC獲取請(qǐng)求參數(shù)和域?qū)ο蠊蚕頂?shù)據(jù)的示例代碼
這篇文章主要給大家介紹了SpringMVC獲取請(qǐng)求參數(shù)和域?qū)ο蠊蚕頂?shù)據(jù)的示例代碼,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下2023-12-12
AsyncHttpClient?ClientStats源碼流程解讀
這篇文章主要為大家介紹了AsyncHttpClient?ClientStats源碼流程解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
java web FTPClient實(shí)現(xiàn)上傳文件到指定服務(wù)器
這篇文章主要為大家詳細(xì)介紹了java web FTPClient實(shí)現(xiàn)上傳文件到指定服務(wù)器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06

