如何使用 class 中的两个不同对象和 Java 中的比较字段过滤列表
How to filter a List with two object of different class and with compare field in 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 或任何第三方库进行过滤?
我不知道如何只用一个流来做到这一点,但至少我有两个解决方案。
List<ObjectOne> list1 = new ArrayList<>();
List<ObjectTwo> list2 = new ArrayList<>();
list1.stream()
.filter(o1 -> isInObjectTwoList(list2, o1))
.collect(Collectors.toList());
private boolean isInObjectTwoList(List<ObjectTwo> objectTwoList, ObjectOne o1) {
return objectTwoList.stream()
.filter(o2 -> o2.getText().equals(o1.getValue()))
.findAny()
.isPresent();
}
您可以从 ObjectTwo
列表创建 ObjectOne
列表,如下所示:
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);
注意,此解决方案需要在ObjectOne
中使用hashcode
和equals
。
noneMatch
帮到你。
objectOnes.stream()
.filter(x -> objectTwos.stream()
.noneMatch(y -> y.text.equals(x.name) && y.xId == x.id))
.collect(Collectors.toList());
我有两个不同的列表。我想按不在其他列表中的字段查找和过滤。例如。
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 或任何第三方库进行过滤?
我不知道如何只用一个流来做到这一点,但至少我有两个解决方案。
List<ObjectOne> list1 = new ArrayList<>();
List<ObjectTwo> list2 = new ArrayList<>();
list1.stream()
.filter(o1 -> isInObjectTwoList(list2, o1))
.collect(Collectors.toList());
private boolean isInObjectTwoList(List<ObjectTwo> objectTwoList, ObjectOne o1) {
return objectTwoList.stream()
.filter(o2 -> o2.getText().equals(o1.getValue()))
.findAny()
.isPresent();
}
您可以从 ObjectTwo
列表创建 ObjectOne
列表,如下所示:
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);
注意,此解决方案需要在ObjectOne
中使用hashcode
和equals
。
noneMatch
帮到你。
objectOnes.stream()
.filter(x -> objectTwos.stream()
.noneMatch(y -> y.text.equals(x.name) && y.xId == x.id))
.collect(Collectors.toList());