根据另一个列表中的条件删除一个列表中的某些元素
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了根据另一个列表中的条件删除一个列表中的某些元素相关的知识,希望对你有一定的参考价值。
我是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()));
}
有没有更好的方法来处理循环?任何帮助表示赞赏。
答案
你现在拥有的代码完美无缺,但也是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()));
另一答案
只是另一种做同样但不改变原始列表的方法:
Set<String> childIds = childrenList.stream()
.map(Children::getPersonId)
.collect(Collectors.toSet());
personList = personList.stream().filter(person ->
!childIds.contains(person.getPersonId())
).collect(Collectors.toList());
它应该有一些增加的空间复杂性,但你可以在这里利用parallelStream
。
以上是关于根据另一个列表中的条件删除一个列表中的某些元素的主要内容,如果未能解决你的问题,请参考以下文章