【问题标题】:Remove certain elements in one list based on condition from another list根据条件从另一个列表中删除一个列表中的某些元素
【发布时间】:2018-08-07 15:01:21
【问题描述】:

我对 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 循环?任何帮助表示赞赏。

【问题讨论】:

  • 它很容易阅读,它使用removeIf(正是它的用途),你为什么要改变它?

标签: java lambda foreach java-8 stream


【解决方案1】:

您现在拥有的代码可以完美运行,但也是O(n * m),因为removeIf 会为每个Children 迭代List。一种改进方法是将每个孩子的personId 存储在Set&lt;String&gt; 中,如果personId 包含在Set 中,则从List&lt;Person&gt; 中删除每个Person

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

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

【讨论】:

  • 感谢您的回复。此代码将运行得更快。
  • 速度的任何变化对于小型数据集都可以忽略不计,但不客气!
【解决方案2】:

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

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

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

它应该会增加一些空间复杂度,但您可以在此处利用parallelStream

【讨论】:

    【解决方案3】:

    在此处添加以防有人需要它;

    如果你要做的不是检查内容,而是一个均衡,你可以做如下相同的代码;

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

    此代码用途广泛,为我节省了几行代码和 forEach 循环的需要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-20
      • 2021-11-25
      • 2022-11-13
      • 2018-09-14
      • 1970-01-01
      • 2019-10-24
      • 2018-09-04
      相关资源
      最近更新 更多