鍍金池/ 問答/Java  網(wǎng)絡(luò)安全/ java List包裝類型,封裝對象問題

java List包裝類型,封裝對象問題

比如,有兩個類A、B:

public class A{
    private int a1;
    private int a2;
    private B b;
    //getter setter
}
public class B{
    private int b1;
    private int b2;
    private int a1;
    //getter setter
}
public static void main(String[] args) {
    Set<A> arr = service1.findList();
    List<B> arr2 = service2.findList();
}

現(xiàn)在我需要,arr中item的a1如果等于arr2的item2的a1,就把item2放到item的b屬性中,正常來說這樣子

public static void main(String[] args){
    Set<A> arr = service1.findList();
    List<B> arr2 = service2.findList();
    Iterator<A> it = arr .iterator();
    while(it.hasNext()){
        A a = it.next();
        arr2.forEach(b->{
            if(a.getA1() == b.getA1()){
                a.setB(b);
                return;
            }
        });
    }
}

但是一坨這樣子雙循環(huán)看到都惡心,有沒有好的方法,目前用jdk8

回答
編輯回答
帥到炸

一樓正解,用java8的lambda表達(dá)式可以很簡練的實(shí)現(xiàn):

Map<Integer, B> bMap = arr2.stream().collect(Collectors.toMap(B::getA1, Function.identity()));
arr.forEach(a -> {
            B b = bMap.get(a.getA1());
            a.setB(b);
        });
2017年7月11日 18:03
編輯回答
夕顏

單純從效率上考慮,你這樣子雙循環(huán)的復(fù)雜度是O(n^2),其實(shí)可以優(yōu)化的:

先做一個Map<Integer, B>,即a1->B的映射,再遍歷Set<A>就可以了。

2017年10月1日 02:42