【问题标题】:How to remove few objects from a List of Object如何从对象列表中删除几个对象
【发布时间】:2019-04-13 18:48:57
【问题描述】:

假设我有一个 Employee 对象列表,并且每个 Employee 类都有诸如 employeeName、employeeAddress、salary 等属性。现在我必须删除名称为“John”且 Salary > 40000 的 Employee 对象。

List empList = new ArrayList(); // 将百万员工添加到 empList。

根据我的理解删除具有上述条件的员工,我应该使用以下代码:

Iterator<Employee> iterator = list.iterator();
while (iterator.hasNext()) {
      Employee employee = iterator.next();
      if ("John".equals(employee.getName) && employee.getSalary>40000) { 
      iterator .remove(); 
    }
 }

所以基本上上面的代码将从列表中删除所需的 Employee 对象。 如果我的理解正确,请告诉我。

除此之外,请澄清以下内容: 1. 当我们有数百万条记录时,我们将如何解决这个问题。 2.iterator.remove()和list.remove()的区别

提前致谢。

【问题讨论】:

    标签: jakarta-ee collections iterator


    【解决方案1】:

    1) 如果你想让对象保持活动状态,你只能过滤需要的对象

    list.stream()
    .filter(emp->"John".equals(emp.getName()) && emp.getSlaray() >40000)
    .collect(Collectors.toList());
    

    2) 如果您正在迭代一个集合并使用:

    Collection.remove()
    

    特别引发 ConcurrentModifcationException 导致更改先前用于构造完成循环所需的显式调用系列的对象状态的原因,但当您使用时

    Iterator.remove()
    

    您更改基础集合并重新评估完成循环所需的显式调用系列。

    【讨论】:

    • 非常感谢您的回复。
    【解决方案2】:

    一次加载数百万个对象并不好。您如何获得所有这些记录?如果您从数据库中读取它们,最好使用 SQL 进行过滤。

    where e.name = "John" and e.salary > 40000
    

    如果你从一个文件中读取它们,你不应该一次读取它们,数据库也是如此。您可以批量获取记录,比如说 1000。

    如果你像上面那样实现它,你也可以使用流:

    List<Employee> filteredList = list.stream()
        .filter(employee -> employee.getName().equals("John"))
        .filter(employee.getSlaray() > 40000)
        .collect(Collectors.toList());
    

    然后您可以将过滤后的 1000 行列表分开处理。

    【讨论】:

    • 1.与迭代器相比,使用流有什么优势。 2. 我们可以使用并行流吗?
    • 1) 没有优势,它适合您的需求。从可读性的角度来看,我更喜欢 Streams,但是如果您有这么多的记录,那么您应该考虑 Streams over for 循环可能带来的时间损失。 2) 当然可以。
    猜你喜欢
    • 2018-07-08
    • 2021-08-03
    • 2021-04-12
    • 1970-01-01
    • 2020-11-07
    • 2019-01-25
    • 2020-06-04
    • 1970-01-01
    相关资源
    最近更新 更多