猿问

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

现在我需要,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;
            }
        });
    }
}

但是一坨这样子双循环看到都恶心,有没有好的方法,目前用jdk8

Helenr
浏览 425回答 2
2回答

牧羊人nacy

单纯从效率上考虑,你这样子双循环的复杂度是O(n^2),其实可以优化的: 先做一个Map<Integer, B>,即a1->B的映射,再遍历Set<A>就可以了。

德玛西亚99

一楼正解,用java8的lambda表达式可以很简练的实现: 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); });
随时随地看视频慕课网APP

相关分类

Java
我要回答