Java8?stream流的map()方法你會使用了嗎
一、前言
在日常的開發(fā)工作中經(jīng)常碰到要處理list中數(shù)據(jù)的問題,比如從數(shù)據(jù)庫中查出了很多學生,由于一些原因需要在內(nèi)存中找出這些學生中的所有姓名,或者把名為“王五”的語文成績暫時修改為“100”,這些問題怎么處理吶,之前我們想到的是遍歷每個元素,然后取出來放到另外一個集合中,在java8中對集合可以進行流式操作使上面的處理更簡潔。今天來看下map()方法的使用。
二、概述
stram流式處理中有map方法,先看下其定義,該方法在java.util.stream.Stream類中,
可以看到map()方法接收一個函數(shù)式接口參數(shù),入?yún)⒂幸粋€T,返回一個Stream流,這個流是R泛型。主要有以下幾點注意,
- 入?yún)⑹且粋€流中的元素;
- 出參是一個流,且流中是新元素;
用圖表示就是下面的樣子,原始流中有四個圓形圖案,調(diào)用map()函數(shù)后變成了四個五角星圖案,這里的圓形圖案和五角星圖案是一一對應的,也就是原始流中有多少個元素,調(diào)用map()方法后依舊有多少個元素,唯一改變的是流中的元素類型。
好了,下面看下怎么使用map()函數(shù)。
三、詳述
以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; /** * 數(shù)學成績 */ 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ù),進行下面的操作。
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()方法,入?yún)⑹荢tudent,出參是以String為泛型的流,最后使用forEach進行了打印,看下結(jié)果
可以看到剛好把所有的學生姓名均打印出來了。如果想把這些學生姓名放到一個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); } } }
結(jié)果如下
同樣的找出所有的班級,找出所有學生的成績都可類比上面的,可以看到打印出的學生姓名或班級是有重復數(shù)據(jù),這個要怎么解決。我們知道在最后是把數(shù)據(jù)放到list中,為了解決重復的問題可以把數(shù)據(jù)放到set中,利用set的去重功能,
//將學生姓名放到Set中,可以實現(xiàn)去重功能 Set<String> studentNames=students.stream().map(student -> student.getName()).collect(Collectors.toSet());
結(jié)果不再打印,有興趣的可以自己試試。
3.2、將姓名為“趙三”的語文成績置為90
現(xiàn)在有這樣一個需求,要把姓名為“趙三”學生的語文成績置為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“,這點是沒錯的。再看原數(shù)據(jù)也被改為了”90“,上面不是提到map()方法生成的是一個新流,原始流中的數(shù)據(jù)也被修改了,因為下面這行代碼是在原始流中元素的基礎上修改的引用類型中的數(shù)據(jù),導致的原始流中的數(shù)據(jù)也會改
map()方法的本意是不會對原始流中的元素造成影響,那么只要new一個對象,返回即可了。現(xiàn)在想找出一年級學生的成績,用map()能實現(xiàn)嗎?
3.3、找出一年級學生的成績
試著去使用map()方法找出所有一年級學生的成績,發(fā)現(xiàn)無法實現(xiàn),因為map()方法強調(diào)原始流中的元素和新流中元素的個數(shù)要相同,或者理解為一一對應,原始流中有5個學生,而要實現(xiàn)的目標流中一年級學生僅有3個,所以使用map()方法無法完成該功能。應該使用什么方法,下期揭曉。
四、總結(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)文章
Java中的HttpServletRequest接口詳細解讀
這篇文章主要介紹了Java中的HttpServletRequest接口詳細解讀,是一個接口,全限定名稱為Jakarta.Serclet.http.HttpServletRequest2023-11-11
HttpServletRequest接口是Servlet規(guī)范的一員,需要的朋友可以參考下SpringMVC獲取請求參數(shù)和域?qū)ο蠊蚕頂?shù)據(jù)的示例代碼
這篇文章主要給大家介紹了SpringMVC獲取請求參數(shù)和域?qū)ο蠊蚕頂?shù)據(jù)的示例代碼,文中通過代碼示例給大家介紹的非常詳細,具有一定的參考價值,需要的朋友可以參考下2023-12-12AsyncHttpClient?ClientStats源碼流程解讀
這篇文章主要為大家介紹了AsyncHttpClient?ClientStats源碼流程解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12java web FTPClient實現(xiàn)上傳文件到指定服務器
這篇文章主要為大家詳細介紹了java web FTPClient實現(xiàn)上傳文件到指定服務器,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-06-06