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

Jam*_*mes 5 java loops

我有以下代码:

for (Attribute thisAttribute : factor.getAttributes()) {
// blabla
}
Run Code Online (Sandbox Code Playgroud)

哪里有factor.getAttributes()回报List<Attribute>.

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

Nat*_*hes 7

把它想象成被翻译成:

{
    Iterator<Attribute> it = factor.getAttributes().iterator();
    while (it.hasNext()) {
        Attribute thisAttribute = it.next();
        // loop body here
    }
}
Run Code Online (Sandbox Code Playgroud)

编译器知道它有一个Iterable,它可以从它获取Iterator一次并在循环中使用它.

事实证明,Java语言规范似乎同意,它说:

增强的for语句相当于表单的基本for语句:

for (I #i = Expression.iterator(); #i.hasNext(); ) {
    {VariableModifier} TargetType Identifier =
        (TargetType) #i.next();
    Statement
}
Run Code Online (Sandbox Code Playgroud)

  • 挑剔:不应该是`Iterator <Attribute> it = factor.getAttributes().terator();`? (3认同)
  • JLS参考:http://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.14.2 (2认同)