簡體   English   中英

根據另一個列表中的條件刪除一個列表中的某些元素

[英]Remove certain elements in one list based on condition from another list

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

有沒有更好的方法來處理 for 循環? 任何幫助表示贊賞。

您現在擁有的代碼可以完美運行,但也是O(n * m)因為removeIf遍歷每個ChildrenList 一種改進方法是將每個孩子的personId存儲在Set<String>中,如果personId包含在Set中,則從List<Person> Person刪除每個人:

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

在這里添加這個以防有人需要它;

如果你想做的不是檢查內容,而是均衡,你可以做同樣的代碼如下;

listName.removeIf(listItem -> listItem.getName().equalsIgnoreCase("Name") ||
                    listItem.getName().equalsIgnoreCase("Other Name"));

這段代碼用途廣泛,節省了我的代碼行和 forEach 循環的需要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM