根据其他列表中的匹配对象更新列表中两个对象的属性

bogh5gae  于 2021-06-26  发布在  Java
关注(0)|答案(1)|浏览(300)

我有两个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 value字段中的值,根据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)²) 正确的?有没有更有效的方法?

b4wnujal

b4wnujal1#

如果您关心性能,可以将其中一个列表转换为以id为键的查找Map,然后更新另一个列表。它的复杂性是o(n)。
您可以这样创建查找Map:

Map<Integer, Object2> map = new HashMap<>();
for (Object2 obj : l2) {
    map.put(obj.getId(), obj);
}

或使用流:

Map<Integer, Object2> map = l2.stream()
      .collect(Collectors.toMap(Object2::getId, obj -> obj));

现在,您可以在Map的帮助下迭代第一个列表并用值更新元素。

l1.stream().forEach(o1 -> o1.setValue2(map.get(o1.getId()).getValue()));

或者,如果 Object2 只有 id 以及 value ,你甚至可以创建一个 map<id, value> :

Map<Integer, String> map = new HashMap<>();
for (Object2 obj : list) {
    map.put(obj.getId(), obj.getValue());
}

l1.stream().forEach(o1 -> o1.setValue2(map.get(o1.getId())));

相关问题