我有以下代码:
for (Attribute thisAttribute : factor.getAttributes()) {
// blabla
}
其中factor.getAttributes()
返回List<Attribute>
。
显然,factor.getAttributes()
只有一个初始调用,然后遍历开始。但是,我不明白为什么只有一个电话。如果我在常规for()
循环的头部中包含函数调用,我相信它将在每次迭代时进行评估。在这方面,高级循环如何以及为何与众不同?
答案 0 :(得分:7)
将其视为转化为:
{
Iterator<Attribute> it = factor.getAttributes().iterator();
while (it.hasNext()) {
Attribute thisAttribute = it.next();
// loop body here
}
}
编译器知道它有一个Iterable,它可以从中获取Iterator并在循环中使用它。
事实证明Java language specification似乎同意,它说:
增强的for语句相当于表单的基本for语句:
for (I #i = Expression.iterator(); #i.hasNext(); ) {
{VariableModifier} TargetType Identifier =
(TargetType) #i.next();
Statement
}