是否每次都为 Iterables 调用 for 循环的“条件”?
Posted
技术标签:
【中文标题】是否每次都为 Iterables 调用 for 循环的“条件”?【英文标题】:Is the "condition" of a for loop called each time for Iterables? 【发布时间】:2011-12-03 06:40:24 【问题描述】:假设我有以下代码:
for (Object obj : Node.getIterable())
//Do something to object here
并且 Node.getIterable() 返回一个可迭代对象。 getIterable() 函数是每次调用还是仅在 for 循环启动时调用?我应该将其更改为:
Iterable<Object> iterable = new Iterable<Object>();
//populate iterable with objects
for (Object obj : iterable)
//Do something
【问题讨论】:
简单的方法来找出...只需将 Node.getIterable 包装在一个方法中,该方法还可以将一些内容写入控制台(或者如果您愿意,可以写入文件)。然后你就可以看到它被调用了多少次。我的赌注 - 它只被调用一次,但我没有足够的信心给出明确的答案。 【参考方案1】:Java 语言规范详细说明了 foreach 语句的作用。有关详细信息,请参阅“14.14.2 增强的 for 语句”(http://java.sun.com/docs/books/jls/third_edition/html/statements.html#14.14.2)。但简而言之,实际上该语言确实保证您正在迭代的表达式只会被计算一次。
【讨论】:
【参考方案2】:不,它没有。它将从getIterable()
接收到的可迭代项保存在内存中并使用该引用。快速检查的方法是在for
语句处设置一个断点并调试进入JDK 的方式。你会知道的。
【讨论】:
以上是关于是否每次都为 Iterables 调用 for 循环的“条件”?的主要内容,如果未能解决你的问题,请参考以下文章