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())));