为了账号安全,请及时绑定邮箱和手机立即绑定

java List包装类型,封装对象问题

java List包装类型,封装对象问题

Helenr 2019-02-23 21:10:20
比如,有两个类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
查看完整描述

2 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

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

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

查看完整回答
反对 回复 2019-03-01
?
德玛西亚99

TA贡献1770条经验 获得超3个赞

一楼正解,用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);
        });
查看完整回答
反对 回复 2019-03-01
  • 2 回答
  • 0 关注
  • 424 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信