【问题标题】:Would a Java foreach loop get a list each iteration [duplicate]Java foreach循环每次迭代都会获得一个列表吗?
【发布时间】:2014-07-18 07:58:55
【问题描述】:

假设我有一个dataObject,他有一个返回集合的getChildren() 函数,但无论出于何种原因,这是一个我想避免的缓慢过程。然后我想迭代所述集合。为此,getChildren() 将在没有子项时返回一个空集合,而不是 null

我可以不做吗:

for(dataObject child : parent.getChildren()){ ... }

或者是每个循环都调用getChildren(),这意味着为了避免每次调用代价高昂,我需要改为:

Collection<dataObject> children = parent.getChildren();
for(dataObject child : children){ ... }

如果我的父级返回不同的集合,这也可能会导致问题,例如,如果添加/删除了一个子级,并且我当时想查看子级的快照(让我们掩盖其他问题)。

我怀疑第一个版本确实没问题,因为 for 循环在启动时会为集合获取一个迭代器,并且只是引用该迭代器,但这是我从未确认过的。

【问题讨论】:

  • 当然不是,这对每个人来说都太慢了。但是您可以自己检查一下:如果您无法调试,只需在 getChildren 中添加一个 println。
  • 在getChildren中下一个断点,看是不是每次都被调用
  • @AnkitLamba 不确定是否是,这是专门询问如何首先查询 Collection。

标签: java collections foreach


【解决方案1】:

来自JLS

增强的 for 语句等价于基本的 for 语句 形式:

for (I #i = Expression.iterator(); #i.hasNext(); ) {
    {VariableModifier} TargetType Identifier =
        (TargetType) #i.next();
    Statement
}

所以它只评估 Iterable 一次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-14
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    相关资源
    最近更新 更多