Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中如何过滤具有两个不同类的对象和具有比较字段的列表_Java_Spring_Stream_Java Stream_Apache Commons - Fatal编程技术网

Java中如何过滤具有两个不同类的对象和具有比较字段的列表

Java中如何过滤具有两个不同类的对象和具有比较字段的列表,java,spring,stream,java-stream,apache-commons,Java,Spring,Stream,Java Stream,Apache Commons,我有两个不同的清单。我想按其他列表中没有的字段查找和筛选。比如说 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

我有两个不同的清单。我想按其他列表中没有的字段查找和筛选。比如说

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"}



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

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();
}
List list1=new ArrayList();
List list2=新的ArrayList();
列表1.stream()
.filter(o1->isInObjectTwoList(列表2,o1))
.collect(Collectors.toList());
私有布尔值isInObjectTwoList(List objectTwoList,ObjectOne o1){
返回objectTwoList.stream()
.filter(o2->o2.getText().equals(o1.getValue()))
.findAny()
.isPresent();
}

我不知道如何用一个流来实现这一点,但至少我得到了两个流的解决方案

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();
}
List list1=new ArrayList();
List list2=新的ArrayList();
列表1.stream()
.filter(o1->isInObjectTwoList(列表2,o1))
.collect(Collectors.toList());
私有布尔值isInObjectTwoList(List objectTwoList,ObjectOne o1){
返回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());

如果不修改
ObjectOne
的列表,则可以从
listOne

List<ObjectOne> listOne2 = new ArrayList<>(listOne);
listOne2.retainAll(objectOne);
List listOne2=新的ArrayList(listOne);
列表2.保留(对象一);

注意,此解决方案需要在
ObjectOne
中使用
hashcode
equals
,您可以从
ObjectTwo
列表中创建
ObjectOne
列表,如下所示:

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

如果不修改
ObjectOne
的列表,则可以从
listOne

List<ObjectOne> listOne2 = new ArrayList<>(listOne);
listOne2.retainAll(objectOne);
List listOne2=新的ArrayList(listOne);
列表2.保留(对象一);

注意,此解决方案需要在
ObjectOne
中使用
hashcode
equals

noneMatch
来帮助您

objectOnes.stream()
          .filter(x -> objectTwos.stream()
                                 .noneMatch(y -> y.text.equals(x.name) && y.xId == x.id))
          .collect(Collectors.toList());

noneMatch
在这里帮助您

objectOnes.stream()
          .filter(x -> objectTwos.stream()
                                 .noneMatch(y -> y.text.equals(x.name) && y.xId == x.id))
          .collect(Collectors.toList());