Java8流-比较两个列表的对象值并将值添加到第一个列表的子对象?

Arpit Mathur

我有两节课:

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和流实现此功能?

Devstr

listOne.size()为N且listTwo.size()为M。那么2换环解的复杂度为O(M * N)。

我们可以listTwo通过id索引将其减少为O(M + N)

情况1-假设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())));

情况2-假设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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用 java8 流从另一个列表创建对象列表

列表流JAVA8中的列表

在Java8流嵌套列表

java8流收集不同的列表

Java比较两个列表的对象值?

如何在Java8流中将两个String列表合并为一个列表而不重复

Java - 迭代两个列表,比较然后添加到另一个列表

Java8流使用流畅的API减少对象列表

如何使用Java 8流将两个或更多不同对象列表的值设置为一个对象?

比较两个对象列表并通过比较java 8中两个列表的一个属性形成一个新列表

比较2个列表,然后使用Java8将匹配项添加到对象映射中

使用Java8流减少Java列表中的元素

如何从列表<object>由对象采取多个域值与Java8流创建HashSet的?

同时将流中的对象添加到两个不同的列表中

规格列表结合使用java8流

我如何排序与java8流TreeSets的列表

Java8:如何从流中聚合对象?

使用Java8流找到从地图的最高值

Java8:流相同的流中的映射的两个属性

如何将Java8流的元素添加到现有列表中

使用Java8流从List <Obj>中查找一个值的总计

Java 8流异常处理,同时将对象从函数返回值添加到列表

在JAVA中将列表对象添加到另一个列表中

Java - 如何遍历对象数组列表并将满足特定条件的元素添加到另一个对象数组列表

Java-如何将一个对象添加到另一个对象的列表中

如何使用 Java 8 lambdas 将对象添加到另一个列表内的列表中

Java的8两个列表流

有没有办法在一个Java8流中读取两个或更多文件?

Java8将对象列表转换为对象的一个属性列表