【发布时间】:2021-01-07 10:48:52
【问题描述】:
我有两个 Pojo:
class Object1 {
public Object1(String id) {
this.id = id;
}
private String id;
private Integer value1;
private Integer value2;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Integer getValue1() {
return value1;
}
public void setValue1(Integer value1) {
this.value1 = value1;
}
public Integer getValue2() {
return value2;
}
public void setValue2(Integer value2) {
this.value2 = value2;
}
}
public class Object2 {
private String id;
private Integer value;
public Object2(String id) {
this.id = id;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Integer getValue() {
return value;
}
public void setValue(Integer value) {
this.value = value;
}
}
我有两个这些对象的列表,其中对象具有相同的 ID。我想通过设置两个对象的 ID 匹配的 object2 值字段中的值,根据 l2 中对象的值来设置列表 l1 中对象的 value2。
import java.util.Arrays;
import java.util.List;
public class Main{
public static void main(String[] args) {
Object1 o1_1 = new Object1("asdf");
Object1 o1_2 = new Object1("qwert");
List<Object1> l1 = Arrays.asList(o1_1, o1_2);
Object2 o2_1 = new Object2("asdf");
o2_1.setValue(123);
Object2 o2_2 = new Object2("qwert");
o2_2.setValue(456);
List<Object2> l2 = Arrays.asList(o2_1, o2_2);
l1.forEach(object1 -> l2.stream()
.filter(object2 -> object1.getId().equals(object2.getId()))
.forEach(object2 -> object1.setValue2(object2.getValue())));
}
}
如何使用 java 流 API 有效地做到这一点?
这个解决方案正确吗? 复杂度是 O(n²) 对吧?有没有更有效的方法?
【问题讨论】:
-
您已经在使用 Stream API,您期待什么?
-
都是
N的大小列表吗?他们可以根据id重复吗? -
可能提高效率的唯一方法是使用
Map和/或将两个匹配的对象存储为单个 ID 下的某种元组/对类型对象,或者甚至组合两个如果模型允许的话。但那是数据结构优化,而不是算法。 -
如果您关心性能,您可以将其中一个列表转换为以 ID 为键的查找映射,然后更新另一个列表。它的复杂度为 O(N)。
-
@azro: 只是想检查一下我的解决方案是否正确可以改进
标签: java java-stream