我是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()));
}
HANDLE for-loop有没有更好的方法?任何帮助表示赞赏。
答案 0 :(得分:7)
您现在拥有的代码完美无缺,但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()));
在<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<nav class="navbar navbar-light bg-faded">
<div class="container">
<button class="navbar-toggler navbar-toggler-right" type="button" data-toggle="collapse" data-target="#navbar">
<span class="navbar-toggler-icon"></span>
</button>
<div class="navbar-collapse collapse" id="navbar">
<ul class="navbar-nav nav-fill">
<li class="nav-item">
<a class="nav-link" href="#">Link</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Link</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Link</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Link</a>
</li>
<li class="nav-item">
<a class="nav-link" href="#">Link</a>
</li>
</ul>
</div>
</div>
</nav>
:
regex
答案 1 :(得分: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
。
答案 2 :(得分:0)
在需要的情况下在此添加;
如果您要执行的不是检查内容,而是检查均衡,则可以执行以下相同的代码;
listName.removeIf(listItem -> listItem.getName().equalsIgnoreCase("Name") ||
listItem.getName().equalsIgnoreCase("Other Name"));
此代码用途广泛,为我节省了很多代码行,并且省去了forEach循环。