我有两节课:
public class ClassOne {
private String id;
private String name;
private String school;
private String score; //Default score is null
..getters and setters..
}
public class ClassTwo {
private String id;
private String marks;
..getters and setters..
}
而且,我有上述课程的两个清单,
List<ClassOne> listOne;
List<ClassTwo> listTwo;
如果ID相等,如何根据标准比较两个列表并为listOne的得分分配listTwo的分数。我知道,我们可以使用两个for循环来做。但是我想使用Java8流来实现它。
List<ClassOne> result = new ArrayList<>();
for(ClassOne one : listOne) {
for(ClassTwo two : listTwo) {
if(one.getId().equals(two.getId())) {
one.setScore(two.getmarks());
result.add(one);
}
}
}
return result;
如何使用Java8 lambda和流实现此功能?
令listOne.size()
为N且listTwo.size()
为M。那么2换环解的复杂度为O(M * N)。
我们可以listTwo
通过id索引将其减少为O(M + N)。
listTwo
没有具有相同ID的对象// pair each id with its marks
Map<String, String> marksIndex = listTwo.stream().collect(Collectors.toMap(ObjectTwo::getId, ObjectTwo::getMarks));
// go through list of `ObjectOne`s and lookup marks in the index
listOne.forEach(o1 -> o1.setScore(marksIndex.get(o1.getId())));
listTwo
对象具有相同的ID final Map<String, List<ObjectTwo>> marksIndex = listTwo.stream()
.collect(Collectors.groupingBy(ObjectTwo::getId, Collectors.toList()));
final List<ObjectOne> result = listOne.stream()
.flatMap(o1 -> marksIndex.get(o1.getId()).stream().map(o2 -> {
// make a copy of ObjectOne instance to avoid overwriting scores
ObjectOne copy = copy(o1);
copy.setScore(o2.getMarks());
return copy;
}))
.collect(Collectors.toList());
要实现copy
方法,您要么需要创建一个新对象,然后一个一个地复制字段,但是在这种情况下,我更喜欢遵循Builder模式。它还会产生更多的“功能”代码。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句