Представлен как новая функция языка в J2SE 5.0, улучшенный цикл позволяет перебора коллекции без необходимости создания итератора или без того, чтобы рассчитать начало и конец условия для переменной счетчика. Улучшенный цикл является самым простым из новых особенностей немедленно включить в вашем коде. В этом совете вы увидите, как улучшенный цикл заменяющий традиционные способы последовательного доступа к элементам в коллекции.
Итак, что же улучшенный цикл выглядеть? Предположим, у вас есть набор объектов TechTip называется RecentTips. Вы можете использовать улучшенный цикл с коллекцией следующим образом:
for (TechTip tip: RecentTips)
Вы прочитали это как "для каждого TechTip в RecentTips". Здесь переменная отзыв используется для указания на текущий экземпляр TechTip в коллекции. Из-за "для каждого" формулировка, в обмен на расширение построить также упоминается как в обмен на каждую конструкцию.
Если вы сравните улучшенный цикл типичный способ итерации по сбору, стало ясно, что для каждого цикла является простым и может сделать код более читабельным.
Также отметим, что улучшенный цикл предназначен для упрощения работы с дженериков. Хотя этот совет ли включать два примера использования улучшенного цикла с дженерики, это не фокус острия. Вместо этого, цель этой подсказки вы познакомитесь с более основные изменения, которые можно внести в ваш код, чтобы использовать для каждого цикла.
Во-первых, рассмотрим, как можно использовать цикл для перебора элементов массива. Для простоты, нагрузка массива с шестью Интс, которые представляют собой квадраты Интс от нуля до пяти. Вот за цикл, который делает итерации:
for (int i=0; i< squares.length; i++)
Линия иллюстрирует классическое использование для цикла. Она определяет начальное значение одной или нескольких счетчиков, создает условие завершения, и описывает, как счетчики может быть увеличен.
Вот короткая программа, OldForArray, который использует для цикла.
|
Обобщение и запустить программу OldForArray, и вы получите следующее:
0 squared is 0. 1 squared is 1. 2 squared is 4. 3 squared is 9. 4 squared is 16. 5 squared is 25.
Если вы измените тестовую программу использовать улучшенный цикл, можно указать соответствующие величины, а коллекцию, которая поступает из переменных. Вот строки это улучшенный цикл:
for (int i : squares)
Вы можете прочитать эту строку как "итерацию по элементам из коллекции им квадраты". Текущего элемента будут ссылаться Int I. "
Вам не нужно определить, сколько элементов в массиве перед цикла. Существует также нет необходимости указывать, как приращение текущей позиции. "Под одеялом", улучшенный цикл для массива эквивалентно цикле представлены ранее.
Тестовая программа NewForArray дает тот же результат, OldForArray.
|
Массив индексированный набор элементов одного типа, указанного при объявлении массива. В более общем коллекции, например ArrayLists, элементы хранятся в виде объектов. Вы можете использовать этот стиль C цикл для перебора коллекции так:
for (int i = 0; i < list.size(); i++)
Затем вы можете использовать list.get (I) для ссылки на текущий элемент. Например, следующая программа, OldForArrayList, использует autoboxing для заполнения ArrayList и затем считываются из ArrayList:
|
Однако, поскольку ArrayList является частью рамках коллекции, это более общие для перебора, используя итератор в следующем порядке:
|
Вы можете расслоение в этом цикле, как показано в следующей программе, IteratorForArrayList:
|
Это выглядит несколько необычным иметь цикл, не первый или третий параметр. Существует никакого первоначального состояния, а также приращение позицию в списке выполняется в теле цикле с призывом iterator.next ().
Улучшенный цикл составляет явное использование итератора ненужным. Вместо того чтобы создавать итератор для ArrayList, а затем использовать итератор в цикле, можно использовать следующие:
for ( Integer square : squares)
Это свидетельствует о том, что название коллекции квадратов. Он также указывает, что в настоящее время ссылаются пункт имеет тип Integer и на которую ссылается переменная площади.
Этот код не будет компилироваться, потому что нет способа узнать, что содержимое ArrayList имеет тип Integer. Чтобы это исправить, нужно использовать другую функцию внес в J2SE 5.0, а именно дженерики. Вам необходимо указать в декларации, и определения площади, что оно может содержать только элементы типа Integer. Это можно сделать следующим образом:
private static Listsquares = new ArrayList ();
Следующая программа, NewArrayList, показывает, как использовать улучшенный цикл вместе с дженериков
|
Это NewArrayList пример немного упрощенный, но он свидетельствует о синтаксических различий между использованием классической для петель и улучшенный цикл. Вот еще один пример, который сравнивает синтаксических различий между циклами. Пример приводится выдержка из разговора данный Джошуа Блох и Нил Gafter в 2004 году на конференции JavaOne. В данном примере метод применяется к каждому элементу в коллекции. Для начала пример использует итератор следующим образом:
|
Далее, вводится улучшенный цикл, чтобы отказаться от использования итератора:
|
Существует еще предмет того, чтобы относиться к элементам коллекции как тип объекта, а затем приводя их к типу TimerTask. Это исправлено путем введения дженерики так:
|
Важно отметить, что улучшенный цикл не может быть использована во всем мире. Вы не можете использовать улучшенный цикл:
- To remove elements as you traverse collections
- To modify the current slot in an array or list
- To iterate over multiple collections or arrays
Однако помимо этих случаях, вы должны попробовать использовать улучшенный цикл кодом для упрощения кода.
Как и с любой новой, синтаксис для улучшенный цикл может показаться незнакомыми и трудно читать. Вы, вероятно, использовал стиль C цикле на протяжении многих лет и, возможно, в более чем одном языке. Это, однако, не имеющих чистого создать переменную счетчика или Iterator. Вы также не должны беспокоиться о том, где ваша коллекция начинается и заканчивается на создании первоначальной стоимости и условиях завершении цикла.
Дополнительную информацию о расширенном цикле, см.-Для каждого цикла.
Copyright (C) 2004-2005 Sun Microsystems, Inc
Все права защищены.