亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java Streams。如何將多個對象的列表加入并合并為一個對象?

Java Streams。如何將多個對象的列表加入并合并為一個對象?

慕后森 2022-11-30 10:52:15
我有一個與 Java 中的 Streams 相關的要求。我需要遍歷一個對象列表,其中每個對象都有一個 Integer 屬性和一個 List 屬性。我需要的是,如果相同的對象具有相同的 ID,我需要連接列表。讓我用一些簡單的代碼來說明這個例子:這里只定義了 2 個簡單的類:public static class Wrapper {  Integer id ;  List<Element> list;  public Wrapper(Integer id, List<Element> list) {    this.id = id;    this.list = list;  } }public static class Element {  String content ;   public Element(String content) {       this.content = content;   }  }現在在 Main Java 方法中,為示例的 porpuse 創建相同的對象:    List<Wrapper> list=new ArrayList();    ArrayList<Element> listForWrapper1= new ArrayList();    listForWrapper1.add(new Element("Content A"));    listForWrapper1.add(new Element("Content B"));    ArrayList<Element> listForWrapper2= new ArrayList();    listForWrapper2.add(new Element("Content C"));    listForWrapper2.add(new Element("Content D"));    ArrayList<Element> listForWrapper3= new ArrayList();    listForWrapper3.add(new Element("Content E"));    listForWrapper3.add(new Element("Content F"));     Wrapper wrapper1=new Wrapper(1,listForWrapper1);     Wrapper wrapper2=new Wrapper(2,listForWrapper2);     //Here this Wrapper has the same ID than wrapper2     Wrapper wrapper3=new Wrapper(2,listForWrapper3);     //Adding Elements to List     list.add(wrapper1);     list.add(wrapper2);     list.add(wrapper3);如您所見,我在列表中添加了 3 個包裝器,但其中 2 個具有相同的 ID我想要的是當包裝器 ID 在數組中相同時,只需合并兩個列表。所以在這個例子中,結果應該是:包含 2 個元素的列表:元素 1 :ID 為 1 的包裝對象,其列表屬性中有 2 個元素,元素內容 A 和元素內容 B元素 2:ID 為 2 的包裝對象,其列表屬性中有 4 個元素,元素內容 C、元素內容 D、元素內容 E 和元素內容 F。如何使用 Streams 實現此結果?我想不出任何優雅的解決方案!提前致謝!List<Wrapper> combinedList=list.stream().....
查看完整描述

3 回答

?
守著一只汪

TA貢獻1872條經驗 獲得超4個贊

您可以BinaryOperator<U> mergeFunction在 Collectors.toMap 中使用。


Collection<Wrapper> wrapperList = wrappers.stream()

        .collect(Collectors.toMap(Wrapper::getId, x -> x),

                (oldVal, newVal) -> {

                    oldVal.getElements().addAll(newVal.getElements());

                    return oldVal;

                }))

        .values();

在上面的代碼中,我寫mergeFunction了總是返回 oldVal(oldVal, newVal) -> oldVal但你可以改變你想要的方式。Lambda 函數x -> x也可以寫成Function.identity().


查看完整回答
反對 回復 2022-11-30
?
HUWWW

TA貢獻1874條經驗 獲得超12個贊

您可以使用Collectors.toMap()合并功能添加地圖的值。


Map<Integer, Wrapper> collect = 

        list.stream()

            .collect(Collectors.toMap(w -> w.id,

                                      w -> w,

                                      (w1, w2) -> {

                                         w1.list.addAll(w2.list);

                                         return w1;

                                      })

            );

在職的


import java.util.ArrayList;

import java.util.List;

import java.util.Map;

import java.util.stream.Collectors;


public class Main {

    public static void main(String[] args) {

        List<Wrapper> list=new ArrayList();

        ArrayList<Element> listForWrapper1= new ArrayList();

        listForWrapper1.add(new Element("Content A"));

        listForWrapper1.add(new Element("Content B"));


        ArrayList<Element> listForWrapper2= new ArrayList();

        listForWrapper2.add(new Element("Content C"));

        listForWrapper2.add(new Element("Content D"));


        ArrayList<Element> listForWrapper3= new ArrayList();

        listForWrapper3.add(new Element("Content E"));

        listForWrapper3.add(new Element("Content F"));


        Wrapper wrapper1=new Wrapper(1,listForWrapper1);

        Wrapper wrapper2=new Wrapper(2,listForWrapper2);

        //Here this Wrapper has the same ID than wrapper2

        Wrapper wrapper3=new Wrapper(2,listForWrapper3);



        //Adding Elements to List

        list.add(wrapper1);

        list.add(wrapper2);

        list.add(wrapper3);


Map<Integer, Wrapper> collect =

        list.stream()

            .collect(Collectors.toMap(w -> w.id,

                                      w -> w,

                                      (w1, w2) -> {

                                         w1.list.addAll(w2.list);

                                         return w1;

                                      })

            );

        System.out.println( collect.values() );

    }

}


 class Wrapper {

    Integer id ;

    List<Element> list;


    public Wrapper(Integer id, List<Element> list) {

        this.id = id;

        this.list = list;

    }


     @Override

     public String toString() {

         return id + ":" + list;

     }

 }


 class Element {

    String content ;


    public Element(String content) {

        this.content = content;

    }


     @Override

     public String toString() {

         return content;

     }

 }

輸出


[1:[Content A, Content B], 2:[Content C, Content D, Content E, Content F]]


查看完整回答
反對 回復 2022-11-30
?
胡子哥哥

TA貢獻1825條經驗 獲得超6個贊

你可以試試這個:


Map<Integer, Wrapper> map = list.stream().collect(Collectors.toMap(wrapper -> wrapper.id /*Use the ids as the keys*/, wrapper -> wrapper /*Return the same wrapper as the value*/, (w1, w2) -> {

         w1.list.addAll(w2.list); // If a wrapper with the same id is found, then merge the list of wrapper 2 to the list of wrapper 1 and return wrapper 1.

         return w1;

     }));


list = new ArrayList<>(map.values()); // Create new ArrayList with the values of the map.




System.out.println(list); // [cci.Test$Wrapper@4eec7777, cci.Test$Wrapper@3b07d329]


查看完整回答
反對 回復 2022-11-30
  • 3 回答
  • 0 關注
  • 608 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號