Java从其他两个具有不同对象和公共属性的列表构建一个列表
Posted
技术标签:
【中文标题】Java从其他两个具有不同对象和公共属性的列表构建一个列表【英文标题】:Java build a list from two other lists with different objects and common property 【发布时间】:2020-10-09 23:14:31 【问题描述】:我正在尝试从另外两个不同对象的列表中构建一个具有共同属性的列表。我正在使用 Stream 库,但无法使代码正常工作。这是我尝试过的:
尝试 1(仅返回 ObjectAList 的第一个元素):
private List<ObjectA> getFilteredObjectAList()
return ObjectAList.stream()
.filter(a -> a.getProperty().getPropertyId().equals(
(ObjectBList.stream().map(b -> b.getPropertyId())).findAny().orElse(null)))
.collect(Collectors.toList());
尝试 2(这会引发错误“此表达式的目标类型必须是函数式接口”):
private List<ObjectA> getFilteredObjectAList()
List<ObjectA> list;
ObjectAList.stream()
.forEach(a -> a.getProperty().getPropertyId()
.filter((ObjectBList.stream()
.map((b -> b.getPropertyId())::contains ? list.add(t) : "".isEmpty())))
.collect(Collectors.toList()));
return list;
非常感谢您的帮助。
【问题讨论】:
【参考方案1】:我认为您想返回 ObjectA
值 getProperty().getPropertyId()
存在于某些 ObjectB
值列表中的实例。
您的第一次尝试不起作用,因为它将每个ObjectA
的getPropertyId
与随机getPropertyId
的getPropertyId
进行比较(因为您正在调用findAny
)。
你想要这样的东西:
private List<ObjectA> getFilteredObjectAList()
return ObjectAList.stream()
.filter(a -> ObjectBList.stream().matchAny(b -> b.getPropertyId() ==
a.getProperty().getPropertyId())
.collect(Collectors.toList());
但是,如果列表很大,这种方法可能会很慢,因为您正在扫描ObjectB
列表一次以查找ObjectA
列表的非常成员。您最好构造一个 HashSet
的存在于 ObjectB
列表中的 ID,然后从该集合中的 ObjectA
列表中查找值。
private List<ObjectA> getFilteredObjectAList()
Set<String> ids = ObjectBList.stream().map(ObjectB::getPropertyId)
.collect(Collectors.toCollection(HashSet::new));
return ObjectAList.stream()
.filter(a-> ids.contains(a.getProperty().getPropertyId())
.collect(Collectors.toList());
【讨论】:
谢谢你亲爱的威利斯。我要试试这个。我花了一整天的时间思考解决方案,您的帮助非常宝贵!谢谢,以上是关于Java从其他两个具有不同对象和公共属性的列表构建一个列表的主要内容,如果未能解决你的问题,请参考以下文章
如何断言两个列表包含 NUnit 中具有相同公共属性的元素?