java - 如何过滤具有不同类的两个对象和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 或任何第三方库进行过滤?
解决方案
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);
请注意,此解决方案需要使用hashcode
and equals
in ObjectOne
。
推荐阅读
- css - 将通过javascript附加的图像居中的最佳方法是什么?
- javascript - 使用 javascript 执行时出现问题并提示
- node.js - Angular 导入节点包
- python - 按日期将 pyspark 数据集拆分为两个
- python - 如何在循环中重新分配对象?
- java - 有没有办法模拟 getCTTbl().getTblPr().getTblBorders().getBottom().setColor()?
- php - PHP ldap_read() 没有这样的对象
- marklogic - 关于安排任务
- php - 是否可以有效地将 PDF 拆分为单独的页面(使用 FPDI)?
- android - Android计费空购买清单