迭代Java对象集合时 - 如何改变当前对象?

时间:2012-06-21 12:19:06

标签: java iterator

我将使用迭代器循环Java中的对象集合。我对使用Iterator感到有点困惑(用于每个循环使用)。假设我有这样的代码:

Iterator<Organization> orgIter = orgs.iterator();
while (orgIter.hasNext()) {
    Organization orgObj = orgIter.next();
    orgObj.setChildOrgsTree(generateOrgChildTree(orgObj, new ArrayList<Organization>()));
}

我创建一个新对象,然后更改对象内的字段。我的计划是将我形成的原始对象设置为iteroter等于我创建的此对象的列表(列表未在上面显示,但我只是发现我需要它)。

但如果我不必创建一个新的Object来完成所有这些操作,那将会容易得多。有没有办法可以获得当前对象并改变它?

2 个答案:

答案 0 :(得分:4)

试试这个:

for(Organization org : orgs)
    org.setChildOrgsTree(generateOrgChildTree(org, new ArrayList<Organization>());

答案 1 :(得分:3)

如果迭代器迭代ListQueue实例,则限制较少。只要您不更改列表的结构,就可以使用Iterator.next()返回的对象执行任何操作。当然,该特定对象的类应该允许它被修改,但我认为你可以添加必要的代码......

另一方面,在不使Iterator对象失效的情况下允许的唯一列表结构修改是使用Iterator.remove()删除当前元素,顺便提一下,这是一个可选操作。如果您尝试直接修改列表,那么迭代器将失效,下次您尝试使用它时将获得ConcurrentModificationException

此外,如果您正在迭代Set,通常会受到更多限制:根据实际Set实施的详细信息,您通常无法修改对象中的任意字段。例如,一旦将对象插入hashCode()中,HashSet返回的值就不会更改...

作为旁注,Java中的for-each循环只是使用Iterator的语法糖。如果您不打算使用Iterator.remove(),只需使用for-each循环而不是明确迭代器,并完成它。