如何从对象列表中删除一些对象

时间:2019-04-13 18:48:57

标签: java-ee collections iterator

假设我有一个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()之间的区别

谢谢。

2 个答案:

答案 0 :(得分:0)

一次加载数百万个对象并不是很好。您如何获得所有这些记录?如果从数据库中读取它们,最好使用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 :(得分:0)

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

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

2)如果要遍历集合并使用:

Collection.remove()

专门提出了ConcurrentModifcationException的原因,该原因导致更改了先前用于构造完成循环所需的显式调用系列的对象状态,而使用

Iterator.remove()

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