Arraylist Java8流-比较两个列表';s对象值并将值添加到第一个列表的子对象?
我有两门课:Arraylist Java8流-比较两个列表';s对象值并将值添加到第一个列表的子对象?,arraylist,lambda,java-8,java-stream,Arraylist,Lambda,Java 8,Java Stream,我有两门课: 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; ..get
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相等,如何比较两个列表并根据标准将listTwo中的分数分配给listOne的分数。我知道,我们可以用两个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;
List result=new ArrayList();
for(一级:列表一){
for(第二类:列表二){
如果(一个.getId().equals(两个.getId())){
一个.setScore(两个.getmarks());
结果:增加(一);
}
}
}
返回结果;
如何使用Java8 lambda和streams实现这一点?让listOne.size()
为N,而listwo.size()
为M。
那么2-for-loops解的复杂度为O(M*N)
我们可以通过id索引listwo
将其减少到O(M+N)
案例1-假设listwo
没有具有相同id的对象
要实现
copy
方法,您需要创建一个新对象并逐个复制字段,但在这种情况下,我更愿意遵循以下步骤。它还会产生更多的“功能性”代码。下面的代码将标记从Object2复制到ObjectOne中的分数,如果两个ID相等,则它没有中间对象列表结果
listOne.stream()
.forEach(one -> {listTwo.stream()
.filter(two -> {return two.getId().equals(one.getId());})
.limit(1)
.forEach(two -> {one.setScore(two.getMarks());});
});
这应该行得通
Map<String, String> collect = listTwo.stream().collect(Collectors.toMap(ObjectTwo::getId, ObjectTwo::getMarks));
listOne
.stream()
.filter(item -> collect.containsKey(item.getId()))
.forEach(item -> item.setScore(collect.get(item.getId())));
Map collect=listwo.stream().collect(Collectors.toMap(ObjectTwo::getId,ObjectTwo::getMarks));
李斯顿
.stream()
.filter(item->collect.containsKey(item.getId()))
.forEach(item->item.setScore(collect.get(item.getId())));
除非您需要使用Java-8 streams来实现并行性,否则命令式方法(即您当前的方法)是可行的。即使如此,您需要1)测量,2)测量,3)测量,然后确保将此代码转换为流版本将为您的应用程序带来好处。否则,如果您只是为了使用流而使用流,那么请至少展示您这样做的尝试。您假设listwo
中没有ObjectTwo
s共享相同的ID,这可能是错误的。这是正确的,让我看看是否可以将解决方案推广到重复的可能性。如果我在o1本身中设置属性,而不是创建object?@HarishGupta的副本,那么结果中会出现重复记录。并且结果不会包含我尝试过的listwo
@Devstr中存在的所有标记,并且结果不会给我重复的记录。
listOne.stream()
.forEach(one -> {listTwo.stream()
.filter(two -> {return two.getId().equals(one.getId());})
.limit(1)
.forEach(two -> {one.setScore(two.getMarks());});
});
Map<String, String> collect = listTwo.stream().collect(Collectors.toMap(ObjectTwo::getId, ObjectTwo::getMarks));
listOne
.stream()
.filter(item -> collect.containsKey(item.getId()))
.forEach(item -> item.setScore(collect.get(item.getId())));