如何在不使用嵌套 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()
是 filter
、map
和 collect
的便捷组合
我正在使用 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()
是 filter
、map
和 collect