public static int add(int x,int ...args) {
int sum = x;
for(int arg:args) {
sum += arg;
}
return sum;
}
The enhanced for statement has the form:
EnhancedForStatement:
for ( Var iableModi f ie rsopt
Type Identifier: Expression) Statement
The Expression must either have type Iterable or else it must be of an array
type (§10.1), or a compile-time error occurs.
The scope of a local variable declared in the FormalParameter part of an
enhanced for statement (§14.14) is the contained Statement
The meaning of the enhanced for statement is given by translation into a
basic for statement.
If the type of Expression is a subtype of Iterable, then let I be the type of the
expression Expression.iterator(). The enhanced for statement is equivalent to
a basic for statement of the form:
for (I #i = Expression.iterator(); #i.hasNext(); ) {
VariableModifiersopt Type Identifier = #i.next();
Statement
}
Where #i is a compiler-generated identifier that is distinct from any other identifi-
ers (compiler-generated or otherwise) that are in scope (§6.3) at the point where
the enhanced for statement occurs.
Otherwise, the Expression necessarily has an array type, T[]. Let L1 ... Lm
be the (possibly empty) sequence of labels immediately preceding the enhanced
for statement. Then the meaning of the enhanced for statement is given by the
following basic for statement:
T[] a = Expression;
L1: L2: ... Lm:
for (int i = 0; i < a.length; i++) {
VariableModifiersopt
Type Identifier = a[i];
Statement
}
Where a and i are compiler-generated identifiers that are distinct from any other
identifiers (compiler-generated or otherwise) that are in scope at the point where
the enhanced for statement occurs.
DISCUSSION
The following example, which calculates the sum of an integer array, shows how enhanced
for works for arrays:
int sum(int[] a) {
int sum = 0;
for (int i : a)
sum += i;
return sum;
}
Here is an example that combines the enhanced for statement with auto-unboxing to trans-
late a histogram into a frequency table:
Map<String, Integer> histogram = ...;
double total = 0;
for (int i : histogram.values())
total += i;
for (Map.Entry<String, Integer> e : histogram.entrySet())
System.out.println(e.getKey() + "" + e.getValue() / total);