循环通过Cayenne performQuery()结果时出现意外的值

时间:2013-04-23 20:18:46

标签: java foreach

此方法使用Cayenne SelectQuery

返回员工对象列表
List<Employee> getEmployees() {
  ...
  return getObjectContext().performQuery(query);
}

现在,我正在循环结果

List<Employee> employees = getEmployees();

// test loop 1
for (Employee employee : employees) {
  //print out employee name
}

for (Employee employee : employees) {
  //print out employee name
  if (matchesSomeCondition) {
    employees.remove(employee);
  }
}

// test loop 2
for (Employee employee : employees) {
  //print out employee name
}

在测试循环1中,它将显示例如:

-John Smith
-Jane Doe
-Roger Wilco

在实际删除循环中,它会省略一些人:

-John Smith
-Roger Wilco

然后在测试循环2中输出所有人:

-John Smith
-Jane Doe
-Roger Wilco

当我将删除循环更改为:

List<Employee> badEmployees = new ArrayList<Employee>();
for (Employee employee : employees) {
  //print out employee name
  if (matchesSomeCondition) {
    badEmployees.add(employee);
  }
}
employee.removeAll(badEmployees);

然后循环工作正常。我只是不明白为什么我没有在第一个例子中得到错误或异常。更奇怪的是为什么每个测试循环的结果都不同。

2 个答案:

答案 0 :(得分:0)

Java for-each循环并不是为了操纵它正在迭代的List而设计的。您需要访问Iterator才能删除当前元素。 for-each循环隐藏了迭代器,因此您无法调用remove()

因此,您选择的方法,这是唯一的方式(使用for-each)。

您可以详细了解here

答案 1 :(得分:0)

我只是看着我的旧问题,看到这个仍然没有答案。

删除员工触发了Cayenne的回调,反过来又将员工添加回列表。