Java8 Stream中對集合數(shù)據(jù)進(jìn)行快速匹配和賦值的代碼示例
開幕先看代碼
List<Hero> heroes = StreamListDemo01.heroValues(); List<Salarys> salarysValues = StreamListDemo01.salarysValues(); for (Hero hero : heroes) { if (salarysValues.size()>0) { for (Salarys salarysValue : salarysValues) { if (hero.getId()==salarysValue.getId()) { hero.setSalary(salarysValue.getSalary()); break; } hero.setSalary(0.0F); } }else{ hero.setSalary(0.0F); } }
需求是這個(gè)樣子的
小編是要為一個(gè) Hero 集合中的每個(gè)對象,賦予一個(gè)匹配的 Salarys 對象中的 salary 值。具體實(shí)現(xiàn)方式為遍歷 Hero 集合,對于每一個(gè) Hero 對象,遍歷 Salarys 集合,只有當(dāng) Hero 對象的 ID 與 Salarys 對象的 ID 匹配時(shí),才將 Salarys 對象的 salary 值賦值給 Hero 的 salary 屬性。如果 Hero 的 ID 沒有匹配成功,則將 Hero 的 salary 屬性設(shè)置為 0.0F。如果 Salarys 集合為空,則將 Hero 的 salary 屬性設(shè)置為 0.0F。
雖然通過嵌套for搞定了,但是我想把這玩意搞成Java8 Stream寫法的!接下讓我們開始看逐步拆解吧。
思路概述
- 將heroes轉(zhuǎn)換為Stream對象;
- 使用peek操作設(shè)置所有hero的初始salary為0;
- 對heroes進(jìn)行forEach操作,對于每個(gè)hero,將salarysValues轉(zhuǎn)換為Stream對象;
- 使用filter操作篩選出符合條件的salary(即id匹配);
- 使用findFirst操作獲取第一個(gè)匹配結(jié)果(如果有的話);
- 如果有匹配結(jié)果,則使用ifPresent操作將salary的值賦給該hero的salary屬性。若無匹配結(jié)果,則salary仍為初始值0。
步驟詳解
- 將heroes轉(zhuǎn)換為Stream對象
將heroes集合對象轉(zhuǎn)換為Stream對象,可以使用以下方式:
heroes.stream()
- 使用peek操作設(shè)置所有hero的初始salary為0
使用peek方法來實(shí)現(xiàn)操作了,peek方法會遍歷集合中的每一個(gè)元素,可以對每個(gè)元素進(jìn)行操作并返回一個(gè) Stream 對象。
.peek(hero -> hero.setSalary(0.0F))
- 對heroes進(jìn)行forEach操作,對于每個(gè)hero,將salarysValues轉(zhuǎn)換為Stream對象
在forEach方法中對每個(gè)hero進(jìn)行操作,對于每個(gè)hero,需要將另一個(gè)集合 salarysValues 轉(zhuǎn)換為 Stream 對象,可以使用以下操作:
.forEach(hero -> { salarysValues.stream()
- 使用filter操作篩選出符合條件的salary(即id匹配)
對于 salarysValues 集合中元素的篩選,需要通過filter操作進(jìn)行篩選。filter方法返回一個(gè)Stream,由于我們只需要一個(gè)結(jié)果,因此使用findFirst方法獲取第一個(gè)結(jié)果。
.filter(salary -> hero.getId() == salary.getId())
該代碼會對salarysValues集合中的每個(gè)元素進(jìn)行比較操作,將符合條件的元素返回作為一個(gè)新的Stream,只有符合條件的元素才會繼續(xù)執(zhí)行下面的操作。使用lambda表達(dá)式的方式,將當(dāng)前hero的id和salarysValues集合中的id進(jìn)行比較,如果相同,則返回 true。
- 使用findFirst操作獲取第一個(gè)匹配結(jié)果(如果有的話)
使用findFirst方法獲取第一個(gè)匹配的結(jié)果,如果有分配的Salary,則第一個(gè)匹配結(jié)果應(yīng)該是分配到該Hero的Salary。findFirst方法返回一個(gè)Optional對象,Optional封裝了要返回對象可能為空的情況。
.findFirst()
- 如果有匹配結(jié)果,則使用ifPresent操作將salary的值賦給該hero的salary屬性。若無匹配結(jié)果,則salary仍為初始值0。
使用ifPresent方法,如果結(jié)果不為空(存在匹配結(jié)果),就將結(jié)果設(shè)置給該Hero的Salary,如果不存在匹配結(jié)果,則該Hero的Salary屬性值不被改變,即為初始值0。
.ifPresent(salary -> hero.setSalary(salary.getSalary())); hero.setSalary(0.0F); // 設(shè)置Hero的薪水屬性初始值為0
完整stream代碼示例:
heroes.stream() .peek(hero -> hero.setSalary(0.0F)) // 設(shè)置所有hero的初始salary為0 .forEach(hero -> { salarysValues.stream() .filter(salary -> hero.getId() == salary.getId()) // 篩選出符合條件的salary .findFirst() // 獲取第一個(gè)匹配結(jié)果(如果存在) .ifPresent(salary -> hero.setSalary(salary.getSalary())); // 將匹配到的salary的值賦給hero hero.setSalary(0.0F); // 如果不存在匹配結(jié)果,設(shè)置薪水初始值為0 });
完整示例代碼
public class StreamListDemo01 { private static List<Hero> heroValues(){ List<Hero> heroes = new ArrayList<>(); for (int i = 1; i < 10; i++) { Hero hero = new Hero(); hero.setId(i); hero.setName("張三"+i); heroes.add(hero); } return heroes; } private static List<Salarys> salarysValues(){ List<Salarys> salarysList = new ArrayList<>(); for (int i = 1; i < 5; i++) { Salarys salarys = new Salarys(); salarys.setId(i); salarys.setSalary(1.4F+i); salarysList.add(salarys); } return salarysList; } public static void main(String[] args) { List<Hero> heroes = StreamListDemo01.heroValues(); List<Salarys> salarysValues = StreamListDemo01.salarysValues(); for (Hero hero : heroes) { if (salarysValues.size()>0) { for (Salarys salarysValue : salarysValues) { if (hero.getId()==salarysValue.getId()) { hero.setSalary(salarysValue.getSalary()); break; } hero.setSalary(0.0F); } }else{ hero.setSalary(0.0F); } } heroes.stream() .peek(hero -> hero.setSalary(0.0F)) // 設(shè)置所有hero的初始salary為0 .forEach(hero -> { salarysValues.stream() .filter(salary -> hero.getId() == salary.getId()) .findFirst() .ifPresent(salary -> hero.setSalary(salary.getSalary())); // 將匹配到的salary的值賦給hero }); System.out.println(heroes); } } class Hero{ private String Name; private int Id; private Float Salary; public String getName() { return Name; } public void setName(String name) { Name = name; } public int getId() { return Id; } public void setId(int id) { Id = id; } public Float getSalary() { return Salary; } public void setSalary(Float salary) { Salary = salary; } @Override public String toString() { return "Hero{" + "Name='" + Name + '\'' + ", Id=" + Id + ", Salary=" + Salary + '}'; } } class Salarys{ private int Id; private Float Salary; public int getId() { return Id; } public void setId(int id) { Id = id; } public Float getSalary() { return Salary; } public void setSalary(Float salary) { Salary = salary; } @Override public String toString() { return "Salarys{" + "Id=" + Id + ", Salary=" + Salary + '}'; } }
參考文獻(xiàn):
1. Java 8 Stream API官方文檔:https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html 2. 《Java 8 Stream Tutorial》:https://www.baeldung.com/java-8-streams-introduction
到此這篇關(guān)于Java8 Stream中對集合數(shù)據(jù)進(jìn)行快速匹配和賦值的代碼示例的文章就介紹到這了,更多相關(guān)Java8 Stream對數(shù)據(jù)匹配賦值內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
實(shí)例詳解Java中ThreadLocal內(nèi)存泄露
這一篇文章我們來分析一個(gè)Java中ThreadLocal內(nèi)存泄露的案例。分析問題的過程比結(jié)果更重要,理論結(jié)合實(shí)際才能徹底分析出內(nèi)存泄漏的原因。2016-08-08Java封裝實(shí)現(xiàn)自適應(yīng)的單位轉(zhuǎn)換工具類
這篇文章主要為大家詳細(xì)介紹了如何使用Java封裝實(shí)現(xiàn)一個(gè)自適應(yīng)的單位轉(zhuǎn)換工具類,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-03-03MybatisPlus實(shí)現(xiàn)對象嵌套關(guān)聯(lián)查詢一對多List集合查詢
這篇文章主要介紹了MybatisPlus實(shí)現(xiàn)對象嵌套關(guān)聯(lián)查詢一對多List集合查詢,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05MybatisPlus實(shí)現(xiàn)數(shù)據(jù)攔截的使用示例
在MyBatis-Plus中,可以通過自定義攔截器來實(shí)現(xiàn)對SQL語句的攔截和修改,本文就來介紹一下如何使用,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10淺析Spring boot 中 logback 配置<springPropert
這篇文章主要介紹了淺析Spring boot 中 logback 配置<springProperty> 讀取application.properties 中的屬性,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-02-02Java強(qiáng)制類型轉(zhuǎn)換的所有規(guī)則及說明
這篇文章主要介紹了Java強(qiáng)制類型轉(zhuǎn)換的所有規(guī)則及說明,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06