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

阅读 3.5k
2 个回答

单纯从效率上考虑,你这样子双循环的复杂度是O(n^2),其实可以优化的:

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

一楼正解,用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);
        });
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题