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

问题描述 投票:3回答:2

我是Java8的新手。我需要根据某些标准(来自另一个列表)在一个列表中减去/删除POJO并在UI上显示它。

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

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.

..主要代码..

  // 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()));
 }

有没有更好的方法来处理循环?任何帮助表示赞赏。

java lambda foreach java-8 stream
2个回答
6
投票

你现在拥有的代码完美无缺,但也是O(n * m),因为removeIf为每个List迭代Children。改善的一种方法是将每个孩子的personId存储在Set<String>中,如果他们的Person包含在List<Person>中,则从personId中删除每个Set

Set<String> childIds = childrenList.stream()
                                   .map(Children::getPersonId)
                                   .collect(Collectors.toSet());

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

1
投票

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

 Set<String> childIds = childrenList.stream()
                .map(Children::getPersonId)
                .collect(Collectors.toSet());

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

它应该有一些增加的空间复杂性,但你可以在这里利用parallelStream

© www.soinside.com 2019 - 2024. All rights reserved.