gpt4 book ai didi

java - 如何在必要时使用流 JAVA 8 修改某些值来合并两个 POJOS 列表

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:45:13 25 4
gpt4 key购买 nike

希望你能帮助我。我会尽量让自己清楚问题的标题。我有一个这样的 POJO

public class Factor {
private int id;
private String item;
private int unitId;
private Double factor;

// constructor getters and setters
}

我有两个此类的 List,数据来自两个不同数据库中的两个不同表。

equals方法是这样定义的

import com.google.common.base.Objects;
//....
@Override
public boolean equals( Object o ) {
if ( this == o )
return true;
if ( o == null || getClass() != o.getClass() )
return false;
Factor that = (Factor) o;
return getUnitId() == that.getUnitId() &&
Objects.equal(getItem(), that.getItem());
}

所以当两个对象具有相同的 itemunitId 属性时,它们被认为是相等的。

假设我有这两个列表:

List<Factor> listA = new ArrayList<>();
listA.add(new Factor(1, "Item1", 1, 0.5));
listA.add(new Factor(2, "Item1", 2, 0.6));
listA.add(new Factor(3, "Item2", 1, 1.0));
listA.add(new Factor(4, "Item3", 1, 2.0));

List<Factor> listB = new ArrayList<>();
listB.add(new Factor(0, "Item1", 1, 0.8));
listB.add(new Factor(0, "Item1", 2, 0.9));
listB.add(new Factor(0, "Item4", 1, 1.0));
listB.add(new Factor(0, "Item5", 1, 2.0));

考虑到 equals 方法,列表的前两个元素应被视为相等。

之所以B列表中的ids都是0,是因为那个表没有id字段。

我想要实现的是通过合并这两个列表来创建一个新列表,但是如果对象相等,它应该从 listA 中获取 id以及来自 listB 的因素。

这样,结果列表将有以下对象

(1, "Item1", 1, 0.8)
(2, "Item1", 2, 0.9)
(0, "Item4", 1, 1.0)
(0, "Item5", 1, 2.0)

我知道如何将两个列表与 stream 进行比较并过滤哪些对象相同或不同,但是有人知道如何获得一个新对象组合相等吗?

最佳答案

假设您还覆盖了 hashCode 方法,您可以使用 toMap 收集器:

Collection<Factor> values = Stream.concat(listA.stream(), listB.stream())
.collect(Collectors.toMap(Function.identity(),
Function.identity(), (a, b) -> {
return new Factor(a.getId(), a.getItem(), a.getUnitId(), b.getFactor());
})).values();

关于java - 如何在必要时使用流 JAVA 8 修改某些值来合并两个 POJOS 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55411763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com