Java8 Stream中對(duì)集合數(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è)對(duì)象,賦予一個(gè)匹配的 Salarys 對(duì)象中的 salary 值。具體實(shí)現(xiàn)方式為遍歷 Hero 集合,對(duì)于每一個(gè) Hero 對(duì)象,遍歷 Salarys 集合,只有當(dāng) Hero 對(duì)象的 ID 與 Salarys 對(duì)象的 ID 匹配時(shí),才將 Salarys 對(duì)象的 salary 值賦值給 Hero 的 salary 屬性。如果 Hero 的 ID 沒有匹配成功,則將 Hero 的 salary 屬性設(shè)置為 0.0F。如果 Salarys 集合為空,則將 Hero 的 salary 屬性設(shè)置為 0.0F。
雖然通過(guò)嵌套for搞定了,但是我想把這玩意搞成Java8 Stream寫法的!接下讓我們開始看逐步拆解吧。
思路概述
- 將heroes轉(zhuǎn)換為Stream對(duì)象;
- 使用peek操作設(shè)置所有hero的初始salary為0;
- 對(duì)heroes進(jìn)行forEach操作,對(duì)于每個(gè)hero,將salarysValues轉(zhuǎn)換為Stream對(duì)象;
- 使用filter操作篩選出符合條件的salary(即id匹配);
- 使用findFirst操作獲取第一個(gè)匹配結(jié)果(如果有的話);
- 如果有匹配結(jié)果,則使用ifPresent操作將salary的值賦給該hero的salary屬性。若無(wú)匹配結(jié)果,則salary仍為初始值0。
步驟詳解
- 將heroes轉(zhuǎn)換為Stream對(duì)象
將heroes集合對(duì)象轉(zhuǎn)換為Stream對(duì)象,可以使用以下方式:
heroes.stream()
- 使用peek操作設(shè)置所有hero的初始salary為0
使用peek方法來(lái)實(shí)現(xiàn)操作了,peek方法會(huì)遍歷集合中的每一個(gè)元素,可以對(duì)每個(gè)元素進(jìn)行操作并返回一個(gè) Stream 對(duì)象。
.peek(hero -> hero.setSalary(0.0F))
- 對(duì)heroes進(jìn)行forEach操作,對(duì)于每個(gè)hero,將salarysValues轉(zhuǎn)換為Stream對(duì)象
在forEach方法中對(duì)每個(gè)hero進(jìn)行操作,對(duì)于每個(gè)hero,需要將另一個(gè)集合 salarysValues 轉(zhuǎn)換為 Stream 對(duì)象,可以使用以下操作:
.forEach(hero -> {
salarysValues.stream()- 使用filter操作篩選出符合條件的salary(即id匹配)
對(duì)于 salarysValues 集合中元素的篩選,需要通過(guò)filter操作進(jìn)行篩選。filter方法返回一個(gè)Stream,由于我們只需要一個(gè)結(jié)果,因此使用findFirst方法獲取第一個(gè)結(jié)果。
.filter(salary -> hero.getId() == salary.getId())
該代碼會(huì)對(duì)salarysValues集合中的每個(gè)元素進(jìn)行比較操作,將符合條件的元素返回作為一個(gè)新的Stream,只有符合條件的元素才會(huì)繼續(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對(duì)象,Optional封裝了要返回對(duì)象可能為空的情況。
.findFirst()
- 如果有匹配結(jié)果,則使用ifPresent操作將salary的值賦給該hero的salary屬性。若無(wú)匹配結(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中對(duì)集合數(shù)據(jù)進(jìn)行快速匹配和賦值的代碼示例的文章就介紹到這了,更多相關(guān)Java8 Stream對(duì)數(shù)據(jù)匹配賦值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
利用Spring IOC技術(shù)實(shí)現(xiàn)用戶登錄驗(yàn)證機(jī)制
這篇文章主要為大家詳細(xì)介紹了Spring IOC技術(shù)實(shí)現(xiàn)用戶登錄驗(yàn)證機(jī)制的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10
eclipse導(dǎo)入工程報(bào)錯(cuò)問題項(xiàng)目或者文件有紅叉的解決方案
這篇文章主要介紹了eclipse導(dǎo)入工程報(bào)錯(cuò)問題項(xiàng)目或者文件有紅叉的解決方案,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05
深入理解Java8新特性之Stream API的終止操作步驟
Stream是Java8的一大亮點(diǎn),是對(duì)容器對(duì)象功能的增強(qiáng),它專注于對(duì)容器對(duì)象進(jìn)行各種非常便利、高效的 聚合操作(aggregate operation)或者大批量數(shù)據(jù)操作。Stream API借助于同樣新出現(xiàn)的Lambda表達(dá)式,極大的提高編程效率和程序可讀性,感興趣的朋友快來(lái)看看吧2021-11-11
深入解析Java編程中面向字節(jié)流的一些應(yīng)用
這篇文章主要介紹了Java編程中面向字節(jié)流的一些應(yīng)用,是Java入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-10-10
深入了解JVM(Java虛擬機(jī))內(nèi)存結(jié)構(gòu)
Java虛擬機(jī)(Java Virtual Machine,JVM)是Java程序的運(yùn)行環(huán)境,它是一個(gè)抽象的計(jì)算機(jī)模型,通過(guò)解釋和執(zhí)行Java字節(jié)碼來(lái)運(yùn)行Java程序,本將大家深入了解JVM(Java虛擬機(jī))內(nèi)存結(jié)構(gòu),需要的朋友可以參考下2023-08-08
Maven中引入 springboot 相關(guān)依賴的方式(最新推薦)
這篇文章主要介紹了Maven中引入 springboot 相關(guān)依賴的方式(最新推薦),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2025-04-04
Spring?@EventListener?異步中使用condition的問題及處理
這篇文章主要介紹了Spring?@EventListener?異步中使用condition的問題及處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12

