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