Улучшенный цикл

Представлен как новая функция языка в J2SE 5.0, улучшенный цикл позволяет перебора коллекции без необходимости создания итератора или без того, чтобы рассчитать начало и конец условия для переменной счетчика. Улучшенный цикл является самым простым из новых особенностей немедленно включить в вашем коде. В этом совете вы увидите, как улучшенный цикл заменяющий традиционные способы последовательного доступа к элементам в коллекции.

Итак, что же улучшенный цикл выглядеть? Предположим, у вас есть набор объектов TechTip называется RecentTips. Вы можете использовать улучшенный цикл с коллекцией следующим образом:

for (TechTip tip: RecentTips)

Вы прочитали это как "для каждого TechTip в RecentTips". Здесь переменная отзыв используется для указания на текущий экземпляр TechTip в коллекции. Из-за "для каждого" формулировка, в обмен на расширение построить также упоминается как в обмен на каждую конструкцию.

Если вы сравните улучшенный цикл типичный способ итерации по сбору, стало ясно, что для каждого цикла является простым и может сделать код более читабельным.

Также отметим, что улучшенный цикл предназначен для упрощения работы с дженериков. Хотя этот совет ли включать два примера использования улучшенного цикла с дженерики, это не фокус острия. Вместо этого, цель этой подсказки вы познакомитесь с более основные изменения, которые можно внести в ваш код, чтобы использовать для каждого цикла.

Во-первых, рассмотрим, как можно использовать цикл для перебора элементов массива. Для простоты, нагрузка массива с шестью Интс, которые представляют собой квадраты Интс от нуля до пяти. Вот за цикл, который делает итерации:

for (int i=0; i< squares.length; i++)

Линия иллюстрирует классическое использование для цикла. Она определяет начальное значение одной или нескольких счетчиков, создает условие завершения, и описывает, как счетчики может быть увеличен.

Вот короткая программа, OldForArray, который использует для цикла.


   public class OldForArray {



     public static void main(String[] args){

       int[] squares = {0,1,4,9,16,25};

       for (int i=0; i< squares.length; i++){

         System.out.printf("%d squared is %d.\n",i, squares[i]);

       }

     }

   }

Обобщение и запустить программу 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.


    public class NewForArray {



     public static void main(String[] args) {

       int j = 0;

       int[] squares = {01491625};

       for (int i : squares) {

         System.out.printf("%d squared is %d.\n", j++, i);

       }

     }

   }

Массив индексированный набор элементов одного типа, указанного при объявлении массива. В более общем коллекции, например ArrayLists, элементы хранятся в виде объектов. Вы можете использовать этот стиль C цикл для перебора коллекции так:

for (int i = 0; i < list.size(); i++)

Затем вы можете использовать list.get (I) для ссылки на текущий элемент. Например, следующая программа, OldForArrayList, использует autoboxing для заполнения ArrayList и затем считываются из ArrayList:


   import java.util.ArrayList;

   import java.util.List;



   public class OldForArrayList {

     private static List squares = new ArrayList();



     private static void fillList() {

       for (int i = 0; i < 6; i++) {

         squares.add(i * i);

       }

     }



     private static void outputList() {

       for (int i = 0; i < squares.size(); i++) {

         System.out.printf("%d squared is %d.\n",

           i, squares.get(i));

       }

     }



     public static void main(String args[]) {

       fillList();

       outputList();

     }

   }

Однако, поскольку ArrayList является частью рамках коллекции, это более общие для перебора, используя итератор в следующем порядке:


   whileiterator.hasNext()) {

     doSomethingWith (iterator.next());

   }

Вы можете расслоение в этом цикле, как показано в следующей программе, IteratorForArrayList:


   import java.util.ArrayList;

   import java.util.List;

   import java.util.Iterator;



   public class IteratorForArrayList {



     private static List squares = new ArrayList();



      private static void fillList() {

       for (int i = 0; i < 6; i++) {

         squares.add(i * i);

       }

     }



     private static void outputList() {

       Iterator iterator = squares.iterator();

       int j=0;

       for (; iterator.hasNext();) {

         System.out.printf("%d squared is %d.\n",

                            j++, iterator.next());

       }

     }



     public static void main(String args[]) {

       fillList();

       outputList();

     }

   }

Это выглядит несколько необычным иметь цикл, не первый или третий параметр. Существует никакого первоначального состояния, а также приращение позицию в списке выполняется в теле цикле с призывом iterator.next ().

Улучшенный цикл составляет явное использование итератора ненужным. Вместо того чтобы создавать итератор для ArrayList, а затем использовать итератор в цикле, можно использовать следующие:

for ( Integer square : squares)

Это свидетельствует о том, что название коллекции квадратов. Он также указывает, что в настоящее время ссылаются пункт имеет тип Integer и на которую ссылается переменная площади.

Этот код не будет компилироваться, потому что нет способа узнать, что содержимое ArrayList имеет тип Integer. Чтобы это исправить, нужно использовать другую функцию внес в J2SE 5.0, а именно дженерики. Вам необходимо указать в декларации, и определения площади, что оно может содержать только элементы типа Integer. Это можно сделать следующим образом:

private static List squares
= new ArrayList();

Следующая программа, NewArrayList, показывает, как использовать улучшенный цикл вместе с дженериков


   import java.util.List;

   import java.util.ArrayList;



   public class NewArrayList {

     private static List<Integer> squares

                               new ArrayList<Integer>();



      private static void fillList() {

       for (int i = 0; i < 6; i++) {

         squares.add(i * i);

       }

     }



     private static void outputList() {

       int j=0;

       for (Integer square : squares) {

         System.out.printf("%d squared is %d.\n",

                         j++, square);

       }

     }



     public static void main(String args[]) {

       fillList();

       outputList();

     }

   }

Это NewArrayList пример немного упрощенный, но он свидетельствует о синтаксических различий между использованием классической для петель и улучшенный цикл. Вот еще один пример, который сравнивает синтаксических различий между циклами. Пример приводится выдержка из разговора данный Джошуа Блох и Нил Gafter в 2004 году на конференции JavaOne. В данном примере метод применяется к каждому элементу в коллекции. Для начала пример использует итератор следующим образом:


   void cancelAll (Collection c) {

     for (Iterator i = c.iterator(); i.hasNext()) {

       TimerTask tt = (TimerTaski.next();

       tt.cancel();

     }

   }

Далее, вводится улучшенный цикл, чтобы отказаться от использования итератора:


   void cancelAllCollection c ) {

     for (Object o : c)

       ( (TimerTasko). cancel();

   }

Существует еще предмет того, чтобы относиться к элементам коллекции как тип объекта, а затем приводя их к типу TimerTask. Это исправлено путем введения дженерики так:


   void cancelAllCollection c ) {

     for (TimerTask task : c)

       task.cancel();

   

Важно отметить, что улучшенный цикл не может быть использована во всем мире. Вы не можете использовать улучшенный цикл:

  • 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
Все права защищены.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>