1

此方法使用 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);

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

4

2 回答 2

0

Javafor-each循环不是为操作List它所迭代的而设计的。您需要访问Iterator才能删除当前元素。循环隐藏了迭代器for-each,所以你不能调用remove().

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

你可以在这里阅读更多关于它的信息。

于 2013-04-23T20:47:39.290 回答
0

我只是在看我的老问题,发现这个问题仍然没有答案。

删除员工触发了 Cayenne 中的回调,该回调又将员工添加回列表。

于 2014-04-14T16:18:34.057 回答