在java增强的for循环中,可以安全地假设要循环的表达式只会被评估一次吗?

mor*_*des 13 java

在下面的:

for (String deviceNetwork : deviceOrganizer.getNetworkTypes(deviceManufacturer)) {
    // do something
}
Run Code Online (Sandbox Code Playgroud)

假设deviceOrganizer.getNetworkTypes(deviceManufacturer)只被调用一次是否安全?

Jon*_*eet 18

是的,一点没错.

规范的第14.14.2节:

如果Expression的类型是Iterable的子类型,那么让我成为表达式Expression.iterator()的类型.增强的for语句相当于表单的基本for语句:

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

(替代方案涉及数组.)

注意如何Expression仅在for循环表达式的第一部分中提及 - 因此它仅被评估一次.


Osc*_*Ryz 7

是的,试一试:

public class ForLoop {
    public static void main( String [] args ) {
        for( int i : testData() ){
            System.out.println(i);
        }
    }
    public  static int[] testData() {
        System.out.println("Test data invoked");
        return new int[]{1,2,3,4};
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

$ java ForLoop
Test data invoked
1
2 
3
4
Run Code Online (Sandbox Code Playgroud)