此方法使用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);
然后循环工作正常。我只是不明白为什么我没有在第一个例子中得到错误或异常。更奇怪的是为什么每个测试循环的结果都不同。
答案 0 :(得分:0)
Java for-each
循环并不是为了操纵它正在迭代的List
而设计的。您需要访问Iterator
才能删除当前元素。 for-each
循环隐藏了迭代器,因此您无法调用remove()
。
因此,您选择的方法,这是唯一的方式(使用for-each
)。
您可以详细了解here。
答案 1 :(得分:0)
我只是看着我的旧问题,看到这个仍然没有答案。
删除员工触发了Cayenne的回调,反过来又将员工添加回列表。