最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java8 Stream中對(duì)集合數(shù)據(jù)進(jìn)行快速匹配和賦值的代碼示例

 更新時(shí)間:2023年06月29日 11:48:07   作者:左羊  
這篇文章主要介紹了Java8 Stream中如何對(duì)集合數(shù)據(jù)進(jìn)行快速匹配和賦值,文中通過(guò)代碼示例為大家介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下

開幕先看代碼

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)文章

  • springboot 參數(shù)格式校驗(yàn)操作

    springboot 參數(shù)格式校驗(yàn)操作

    這篇文章主要介紹了springboot 參數(shù)格式校驗(yàn)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 利用Spring IOC技術(shù)實(shí)現(xiàn)用戶登錄驗(yàn)證機(jī)制

    利用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)目或者文件有紅叉的解決方案

    這篇文章主要介紹了eclipse導(dǎo)入工程報(bào)錯(cuò)問題項(xiàng)目或者文件有紅叉的解決方案,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • 深入理解Java8新特性之Stream API的終止操作步驟

    深入理解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編程中面向字節(jié)流的一些應(yīng)用,是Java入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-10-10
  • 深入了解JVM(Java虛擬機(jī))內(nèi)存結(jié)構(gòu)

    深入了解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)依賴的方式(最新推薦)

    這篇文章主要介紹了Maven中引入 springboot 相關(guān)依賴的方式(最新推薦),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2025-04-04
  • Java中Boolean和boolean的區(qū)別詳析

    Java中Boolean和boolean的區(qū)別詳析

    boolean是基本數(shù)據(jù)類型Boolean是它的封裝類,和其他類一樣,有屬性有方法,可以new,下面這篇文章主要給大家介紹了關(guān)于Java中Boolean和boolean區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • Spring?@EventListener?異步中使用condition的問題及處理

    Spring?@EventListener?異步中使用condition的問題及處理

    這篇文章主要介紹了Spring?@EventListener?異步中使用condition的問題及處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • mybatis-plus與JPA混合的使用方式

    mybatis-plus與JPA混合的使用方式

    這篇文章主要介紹了mybatis-plus與JPA混合的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03

最新評(píng)論

宕昌县| 景宁| 临高县| 澳门| 平利县| 潍坊市| 海淀区| 丁青县| 泰来县| 门源| 浦江县| 新邵县| 新竹市| 九寨沟县| 巴塘县| 碌曲县| 棋牌| 专栏| 新蔡县| 婺源县| 陆川县| 濮阳县| 绥宁县| 建德市| 安丘市| 北宁市| 阿拉善右旗| 自治县| 盐池县| 峡江县| 金平| 柯坪县| 黄冈市| 磐石市| 通化市| 普定县| 惠来县| 平山县| 武宣县| 泰兴市| 桃源县|