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


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

最佳答案

Java for-each循环不适用于操纵要迭代的List。您需要访问Iterator才能删除当前元素。 for-each循环隐藏了迭代器,因此您无法调用remove()

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

您可以here详细了解。

关于java - 遍历Cayenne performQuery()结果时出现意外值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16178420/

10-10 17:46
查看更多