如何在不使用嵌套 for 循环的情况下修改 Java 上的数组?

How to modify an Array on Java using without use a nested for loop?

我正在使用 Java 8 和 Groovy,不幸的是我不能使用 lambda,我有两个不同的对象列表,它们有一个共同的属性,在第一个列表中我得到了我需要的大部分数据,在第二个列表上我得到了共同的数据,我写了一个嵌套循环,以便用第二个列表中的共同属性更新第一个列表,我只是想知道是否有更好的改进此代码的方法:

    List<Object1> firstList = dao.something();
    List<Object2> secondList = dao.something2();
    List<Object1> thirdList = new ArrayList<Object1>();

    for (Object1 obj1 : firstList){
        for(Object2 obj2 : secondList){
            if(obj1.getSomething().equals(obj2.getSomething())){
                    obj1.setAttribute(ojb2.getAttribute);
                    thirdList.add(obj1);
            }
        }
    }

任何帮助都会有用,谢谢。

可以使用Iterable的forEach方法遍历每一个元素,在secondList中查找并修改对象的内容

firstList.forEach(elem -> {
        V2 found = secondList.stream().filter(v1 -> v1.getId() == elem.getId()).findAny().orElse(null);               
        if(found != null) {
            elem.setAttribute(found);
        }
    });

或者您可以使用流并将其映射到另一个列表

 List<V1> thirdList = firstList.stream().map(elem -> { 
        V2 found = secondList.stream().filter(v1 -> v1.getId() == elem.getId()).findAny().orElse(null);               
        if(found != null) {
            elem.setAttribute(found);
        }
        return elem;
    }).collect(Collectors.toList());

如果你想比较两个列表,你总是需要迭代两次。 希望对您有所帮助。

您可以使用Groovy的默认收集方式:

List thirdList = firstList.findResults{ obj1 ->
  def obj2attr = secondList.find{ obj1.something == it.something }?.attribute 
  if( obj2attr ){
    obj1.attribute = obj2attr
    obj1
  }else
    null
}

findResults()filtermapcollect

的便捷组合