Несмотря на то, что в предыдущих примерах использовались массивы, цикл for в стиле for-each не ограничивается этой областью применения. Его можно применять для обработки в цикле элементов объекта любого типа, реализующего интерфейс Iterable. К таким типам относятся все коллекции, определенные в подсистеме Collections Framework, модернизация которой для Java 2 v5.0 включает и реализацию интерфейса Iterable. В прошлом обработка коллекции в цикле требовала от Вас применения итератора и явного вызова его методов hasNext() и next(). Улучшенный цикл for теперь автоматизирует этот процесс.
В программе, приведенной в листинге 4.6, демонстрируется использование
улучшенного цикла for для обработки в цикле коллекции типа ArrayList, содержащей числовые значения. Программа вычисляет среднее арифметическое значений списка.
Листинг 4.6. Применение улучшенного цикла for для коллекций
class AvgCollection {
static double getAvg(ArrayList nums) {
double sum = 0.0;
for(double itr : nums)
sum = sum + itr;
return sum / nums.size();
}
public static void main(String args[]) {
ArrayList list = new ArrayList();
list.add(10.14);
list.add(20.22);
list.add(30.78);
list.add(40.46);
double avg = getAvg(list);
System.out.println("List average is " + avg);
}
}
Программа из листинга 4.6 выводит на экран следующую строку:
List average is 25.4
В методе getAvg() следующий цикл for в стиле for-each:
for(double itr : nums)
sum = sum + itr;
заменяет приведенный далее фрагмент кода, в котором применяется явная итерация:
Iterator itr = nums.iterator();
while(itr.hasNext()) {
Double d = itr.next();
sum = sum + d;
}
Как видите, улучшенный цикл for существенно короче и более уместен.
Еще одно замечание: если Вы хотите использовать улучшенный цикл for для обработки в цикле содержимого коллекции с заданным несформированным (raw) типом, переменная цикла должна иметь тип Object. Это означает, что переменную цикла следует явно преобразовать в заданный тип. Откровенно говоря, лучше всего избегать применения несформированных типов, как в цикле for, так и в других ситуациях. Настраиваемые типы предлагают лучшую, более безопасную и удобную альтернативу.
|