假设我有dataObject
,其getChildren()
函数返回一个集合,但无论出于何种原因,我都希望避免这个过程缓慢。然后我想迭代所述集合。为此,getChildren()
会在没有子项时返回空集合,而不是null
。
我可以逃脱:
for(dataObject child : parent.getChildren()){ ... }
或是每次循环调用getChildren()
,这意味着为了避免每次都付出昂贵的电话,我需要改为:
Collection<dataObject> children = parent.getChildren();
for(dataObject child : children){ ... }
如果父母返回一个不同的集合,这也可能会导致问题,例如,如果添加/删除了一个孩子,我想要查看当时孩子们的快照(让我们的光泽度过高)其他问题)。
我怀疑第一个版本确实很好,因为for循环会在它启动时获得集合的迭代器并且只是引用迭代器,但它是我从未确认过的东西。
答案 0 :(得分:3)
来自JLS:
增强的for语句相当于一个基本的for语句 形式:
for (I #i = Expression.iterator(); #i.hasNext(); ) { {VariableModifier} TargetType Identifier = (TargetType) #i.next(); Statement }
所以它只评估Iterable一次。