欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2023年06月29日 11:48:07   作者:左羊  
這篇文章主要介紹了Java8 Stream中如何對集合數(shù)據(jù)進(jìn)行快速匹配和賦值,文中通過代碼示例為大家介紹的非常詳細(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è)對象,賦予一個(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)文章

  • idea中不用git解除關(guān)聯(lián)的方式

    idea中不用git解除關(guān)聯(lián)的方式

    IntelliJ?IDEA是一款高效的Java編程環(huán)境,提供智能編碼輔助、J2EE、Ant等集成,支持本地和遠(yuǎn)程調(diào)試,本文講述了如何在IDEA中解除版本控制和刪除.git文件夾,幫助開發(fā)者更好地管理項(xiàng)目設(shè)置和提升開發(fā)效率
    2024-10-10
  • 實(shí)例詳解Java中ThreadLocal內(nèi)存泄露

    實(shí)例詳解Java中ThreadLocal內(nèi)存泄露

    這一篇文章我們來分析一個(gè)Java中ThreadLocal內(nèi)存泄露的案例。分析問題的過程比結(jié)果更重要,理論結(jié)合實(shí)際才能徹底分析出內(nèi)存泄漏的原因。
    2016-08-08
  • 詳解Java的Spring框架中bean的定義以及生命周期

    詳解Java的Spring框架中bean的定義以及生命周期

    這篇文章主要介紹了Java的Spring框架中bean的定義以及生命周期,bean的實(shí)例化是Java web開發(fā)中的重要基礎(chǔ),需要的朋友可以參考下
    2015-12-12
  • Java封裝實(shí)現(xiàn)自適應(yīng)的單位轉(zhuǎn)換工具類

    Java封裝實(shí)現(xiàn)自適應(yīng)的單位轉(zhuǎn)換工具類

    這篇文章主要為大家詳細(xì)介紹了如何使用Java封裝實(shí)現(xiàn)一個(gè)自適應(yīng)的單位轉(zhuǎn)換工具類,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-03-03
  • IDEA整合jeesite4.x及安裝教程

    IDEA整合jeesite4.x及安裝教程

    本文給大家介紹IDEA整合jeesite4.x及安裝教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-07-07
  • MybatisPlus實(shí)現(xiàn)對象嵌套關(guān)聯(lián)查詢一對多List集合查詢

    MybatisPlus實(shí)現(xiàn)對象嵌套關(guān)聯(lián)查詢一對多List集合查詢

    這篇文章主要介紹了MybatisPlus實(shí)現(xiàn)對象嵌套關(guān)聯(lián)查詢一對多List集合查詢,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • MybatisPlus實(shí)現(xiàn)數(shù)據(jù)攔截的使用示例

    MybatisPlus實(shí)現(xiàn)數(shù)據(jù)攔截的使用示例

    在MyBatis-Plus中,可以通過自定義攔截器來實(shí)現(xiàn)對SQL語句的攔截和修改,本文就來介紹一下如何使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • Spring的組合注解和元注解原理與用法詳解

    Spring的組合注解和元注解原理與用法詳解

    這篇文章主要介紹了Spring的組合注解和元注解原理與用法,結(jié)合實(shí)例形式詳細(xì)分析了spring組合注解和元注解相關(guān)功能、原理、配置及使用方法,需要的朋友可以參考下
    2019-11-11
  • 淺析Spring boot 中 logback 配置<springProperty> 讀取application.properties 中的屬性

    淺析Spring boot 中 logback 配置<springPropert

    這篇文章主要介紹了淺析Spring boot 中 logback 配置<springProperty> 讀取application.properties 中的屬性,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-02-02
  • Java強(qiáng)制類型轉(zhuǎn)換的所有規(guī)則及說明

    Java強(qiáng)制類型轉(zhuǎn)換的所有規(guī)則及說明

    這篇文章主要介紹了Java強(qiáng)制類型轉(zhuǎn)換的所有規(guī)則及說明,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06

最新評論