首页 > 解决方案 > 如何过滤具有不同类的两个对象和Java中的比较字段的列表

问题描述

我有两个不同的列表。我想按不在其他列表中的字段查找和过滤。例如。

List<ObjectOne>      List<ObjectTwo>
field | value        field | value
{id=5, name="aaa"}   {xId=4, text="aaa"}
{id=6, name="bbb"}   {xId=6, text="bbb"}
{id=7, name="ccc"}   {xId=5, text="ccc"}



如果我想过滤一个列表,我正在使用org.springframework.cglib.core.CollectionUtils这样

CollectionUtils.filter(objectOne, s -> (
(ObjectOne) s).getId() == anyObject.getXId()
&&  (ObjectOne) s).getName() == anyObject.getText());

但我想比较两个列表,我想找到这样的非包含值

objectOne = {id=5, name="aaa"} , {id=7, name="ccc"}

如何使用 streamApi 或任何第三方库进行过滤?

标签: javaspringstreamjava-streamapache-commons

解决方案


ObjectOne您可以从以下列表中创建一个列表ObjectTwo

List<ObjectOne> objectOne = listTwo.stream()
        .map(x -> new ObjectOne(x.getxId(), x.getText()))
        .collect(Collectors.toList());

然后你可以用它retainAll来找到共同的元素:

listOne.retainAll(objectOne);

如果您不修改 的列表ObjectOne,则可以创建第二个列表listOne

List<ObjectOne> listOne2 = new ArrayList<>(listOne);
listOne2.retainAll(objectOne);

请注意,此解决方案需要使用hashcodeand equalsin ObjectOne


推荐阅读