Java高级循环:在循环标题中评估(未)的内容是什么?

时间:2014-09-12 14:14:22

标签: java loops

我有以下代码:

for (Attribute thisAttribute : factor.getAttributes()) {
// blabla
}

其中factor.getAttributes()返回List<Attribute>

显然,factor.getAttributes()只有一个初始调用,然后遍历开始。但是,我不明白为什么只有一个电话。如果我在常规for()循环的头部中包含函数调用,我相信它将在每次迭代时进行评估。在这方面,高级循环如何以及为何与众不同?

1 个答案:

答案 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
}