покращений цикл

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

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

Ви прочитали це як "для кожного TechTip в RecentTips". Тут змінна відгук використовується для вказівки на поточний екземпляр TechTip в колекції. Через "для кожного" формулювання, в обмін на розширення побудувати також згадується як в обмін на кожну конструкцію.

Якщо ви порівняєте покращений цикл типовий спосіб ітерації по збору, стало ясно, що для кожного циклу є простим і може зробити код більш читабельним.

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

По-перше, розглянемо, як можна використовувати цикл для перебору елементів масиву. Для простоти, навантаження масиву з шістьма Інтс, які представляють собою квадрати Інтс від нуля до п'яти. Ось за цикл, який робить ітерації:

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

Ось коротка програма, OldForArray, який використовує для циклу.


public class OldForArray

Узагальнення і запустити програму OldForArray, і ви отримаєте наступне:

Якщо ви зміните тестову програму використовувати покращений цикл, можна вказати відповідні величини, а колекцію, яка надходить з змінних. Ось рядки це покращений цикл:

Ви можете прочитати цей рядок як "ітерацію за елементами з колекції їм квадрати". Поточного елемента будуть посилатися Int I. "

Вам не потрібно визначити, скільки елементів в масиві перед циклу. Існує також немає необхідності вказувати, як приріст поточної позиції. "Під ковдрою", покращений цикл для масиву еквівалентно циклі представлені раніше.

Тестова програма NewForArray дає той же результат, OldForArray.


public class NewForArray

Потім ви можете використовувати 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 staticvoid outputList () <
for (int i = 0; i System.out.printf ( ". Squared is .. \ n".
i, squares.get (i));
>
>

public staticvoid main (String args []) <
fillList ();
outputList ();
>
>

Однак, оскільки ArrayList є частиною рамках колекції, це більш загальні для перебору, використовуючи итератор в наступному порядку:


while (iterator.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 staticvoid outputList () <
Iterator iterator = squares.iterator ();
int j = 0;
for (; iterator.hasNext ();) <
System.out.printf ( ". Squared is .. \ n".
j ++, iterator.next ());
>
>

public staticvoid main (String args []) <
fillList ();
outputList ();
>
>

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

Покращений цикл становить явне використання ітератора непотрібним. Замість того щоб створювати итератор для ArrayList, а потім використовувати итератор в циклі, можна використовувати наступні:

Це свідчить про те, що назва колекції квадратів. Він також вказує, що в даний час посилаються пункт має тип Integer і на яку посилається змінна площі.

Цей код не компілюватиметься, тому що немає способу дізнатися, що вміст ArrayList має тип Integer. Щоб це виправити, потрібно використовувати іншу функцію вніс в J2SE 5.0, а саме дженерики. Вам необхідно вказати в декларації, і визначення площі, що воно може містити тільки елементи типу Integer. Це можна зробити наступним чином:

Наступна програма, NewArrayList, показує, як використовувати покращений цикл разом з дженериків


import java.util.List;
import java.util.ArrayList;

public class NewArrayList <
private static List squares
= New ArrayList ();

private staticvoid outputList () <
int j = 0;
for (Integer square. squares) <
System.out.printf ( ". Squared is .. \ n".
j ++, square);
>
>

public staticvoid main (String args []) <
fillList ();
outputList ();
>
>


void cancelAll (Collection c) <
for (Iterator i = c.iterator (); i.hasNext ();) <
TimerTask tt = (TimerTask) i.next ();
tt.cancel ();
>
>

Далі, вводиться поліпшений цикл, щоб відмовитися від використання ітератора:


void cancelAll (Collection c) <
for (Object o. c)
((TimerTask) o). cancel ();
>

Існує ще предмет того, щоб ставитися до елементів колекції як тип об'єкта, а потім приводячи їх до типу TimerTask. Це виправлено шляхом введення дженерики так:


void cancelAll (Collection 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

Однак крім цих випадках, ви повинні спробувати використовувати покращений цикл кодом для спрощення коду.

Додаткову інформацію про розширеному циклі, см.-Для кожного циклу.

Схожі статті