关于java:根据另一个列表中的条件删除一个列表中的某些元素

Remove certain elements in one list based on condition from another list

我对Java8还比较陌生。我需要根据某些条件(从另一个列表中)在一个列表中减去/删除POJO,并将其显示在UI上。

迭代一个列表并搜索条件移除对象将原始列表发送到UI

1
2
3
4
5
6
7
8
9
10
11
12
Children.java
private String firstName;
private String lastName;
private String school;
private String personId;
// Setters and getters.

Person.java
private String personId;
private String fullName;
private String address;
// Setters and Getters.

..主代码…

1
2
3
4
5
6
7
8
9
  // populated by other methods.
  List<Person> personList;

 //Connect to DB and get ChildrenList
 List<Children> childrenList = criteria.list();

 for(Children child : childrenList) {
    personList.removeIf(person -> child.getPersonId().equals(person.getPersonId()));
 }

有没有更好的方法来处理循环?感谢您的帮助。


您现在拥有的代码工作得很好,但也是O(n * m),因为removeIf对每个Children迭代List。一种改进的方法是将每个孩子的personId存储在Set中,如果personId包含在Set中,将每个PersonList中删除:

1
2
3
4
5
Set<String> childIds = childrenList.stream()
                                   .map(Children::getPersonId)
                                   .collect(Collectors.toSet());

personList.removeIf(person -> childIds.contains(person.getPersonId()));


只是做同样的事情的另一种方法,但不改变原始列表:

1
2
3
4
5
6
7
 Set<String> childIds = childrenList.stream()
                .map(Children::getPersonId)
                .collect(Collectors.toSet());

        personList = personList.stream().filter(person ->
                !childIds.contains(person.getPersonId())
        ).collect(Collectors.toList());

它应该会增加一些空间复杂性,但是您可以在这里利用parallelStream