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

时间:2018-02-27 20:41:25

标签: java lambda foreach java-8 stream

我是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有没有更好的方法?任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:7)

您现在拥有的代码完美无缺,但O(n * m)也是removeIf,因为ListChildren遍历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循环。