亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

開幕先看代碼

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);
        }
   }

需求是這個樣子的

小編是要為一個 Hero 集合中的每個對象,賦予一個匹配的 Salarys 對象中的 salary 值。具體實現(xiàn)方式為遍歷 Hero 集合,對于每一個 Hero 對象,遍歷 Salarys 集合,只有當 Hero 對象的 ID 與 Salarys 對象的 ID 匹配時,才將 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進行forEach操作,對于每個hero,將salarysValues轉(zhuǎn)換為Stream對象;
  • 使用filter操作篩選出符合條件的salary(即id匹配);
  • 使用findFirst操作獲取第一個匹配結(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方法來實現(xiàn)操作了,peek方法會遍歷集合中的每一個元素,可以對每個元素進行操作并返回一個 Stream 對象。

.peek(hero -> hero.setSalary(0.0F))
  • 對heroes進行forEach操作,對于每個hero,將salarysValues轉(zhuǎn)換為Stream對象

在forEach方法中對每個hero進行操作,對于每個hero,需要將另一個集合 salarysValues 轉(zhuǎn)換為 Stream 對象,可以使用以下操作:

.forEach(hero -> {
    salarysValues.stream()
  • 使用filter操作篩選出符合條件的salary(即id匹配)

對于 salarysValues 集合中元素的篩選,需要通過filter操作進行篩選。filter方法返回一個Stream,由于我們只需要一個結(jié)果,因此使用findFirst方法獲取第一個結(jié)果。

.filter(salary -> hero.getId() == salary.getId())

該代碼會對salarysValues集合中的每個元素進行比較操作,將符合條件的元素返回作為一個新的Stream,只有符合條件的元素才會繼續(xù)執(zhí)行下面的操作。使用lambda表達式的方式,將當前hero的id和salarysValues集合中的id進行比較,如果相同,則返回 true。

  • 使用findFirst操作獲取第一個匹配結(jié)果(如果有的話)

使用findFirst方法獲取第一個匹配的結(jié)果,如果有分配的Salary,則第一個匹配結(jié)果應(yīng)該是分配到該Hero的Salary。findFirst方法返回一個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() // 獲取第一個匹配結(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 +
                '}';
    }
}

參考文獻:

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ù)進行快速匹配和賦值的代碼示例的文章就介紹到這了,更多相關(guān)Java8 Stream對數(shù)據(jù)匹配賦值內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論