Каковы Преимущества Расширенных для цикла и Итератора в Java?

кто-либо может указать мне, каковы преимущества Расширенных для цикла и Итераторов в Java +5?

22
задан Pascal Thivent 18 August 2010 в 18:24
поделиться

10 ответов

Сильные стороны, а также слабые стороны довольно хорошо резюмированы в Stephen Colebourne (Joda-Time, JSR-310, и т. д.) Улучшено управление итерацией каждого цикла , предложение расширить его в Java 7:

РЕЗЮМЕ:

Расширяет возможности Java 5 для каждого цикла, чтобы разрешить доступ к индекс цикла, является ли это первым или последней итерации, и удалить текущий элемент.

ОСНОВНОЕ ПРЕИМУЩЕСТВО

Цикл for-each почти наверняка самый новый популярная функция из Java 5. Работает потому что это увеличивает абстракцию уровень - вместо того, чтобы выражать низкоуровневые детали того, как зацикливать вокруг списка или массива (с индексом или итератор), разработчик просто заявляет, что они хотят зацикливаться, а язык позаботится обо всем остальном. Однако вся польза теряется, поскольку как только разработчику потребуется доступ индекс или удалить элемент .

Исходная Java 5 для каждой работы занимала относительно консервативная позиция по ряд вопросов, направленных на решение 80% случай. Однако петли такие общая форма в кодировании, что оставшиеся 20% не были решены представляет собой значительный объем кода.

Процесс преобразования цикла назад из для каждого индекса или на основе итератора - это болезненно. Это потому что старый стиль цикла если значительно ниже уровня, больше многословный и менее ясный .Это также болезненно, поскольку большинство IDE не поддерживают это своего рода «дерефакторинг».

ОСНОВНОЕ ПРЕИМУЩЕСТВО:

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

...

Подводя итог, можно сказать, что усовершенствованный цикл for предлагает краткий синтаксис более высокого уровня для перебора списка или массива, который улучшает ясность и читаемость. Однако он пропускает некоторые части: разрешение доступа к циклу индекса или удаление элемента.

См. Также

21
ответ дан 29 November 2019 в 04:50
поделиться

Для меня очевидно, что главное преимущество - читабельность.

for(Integer i : list){
   ....
}

явно лучше, чем что-то вроде

for(int i=0; i < list.size(); ++i){
  ....
}
12
ответ дан 29 November 2019 в 04:50
поделиться

Более чистый синтаксис! С точки зрения производительности разницы нет, так как это просто удобство для программиста.

2
ответ дан 29 November 2019 в 04:50
поделиться

Это более лаконично. Единственная проблема - проверка нуля.

for (String str : strs) {  // make sure strs is not null here
    // Do whatever
}
0
ответ дан 29 November 2019 в 04:50
поделиться

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

Кроме того, он позволяет избежать возможной ошибки 'index out of bound'. Например, при ручной итерации списка вы можете использовать переменную index неправильно, например:

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

что вызовет исключение. Но в случае расширенного цикла for мы оставляем задачу итерации компилятору. Это позволяет полностью избежать ошибки.

1
ответ дан 29 November 2019 в 04:50
поделиться

Цикл foreach/расширенный цикл for/for служит для обеспечения курсора на объект данных. Это особенно полезно, когда вы думаете в терминах "пройтись по файлу строка за строкой" или "пройтись по набору результатов запись за записью", поскольку это просто и легко реализуется.

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

0
ответ дан 29 November 2019 в 04:50
поделиться

Меньше набора текста! Плюс дополнительная помощь от компилятора

-2
ответ дан 29 November 2019 в 04:50
поделиться

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

Читаемость важна.

Prefer this    
for (String s : listofStrings) 
    {
     ... 
    }

over

    for (Iterator<String> iter = listofStrings.iterator(); iter.hasNext(); )
    {
     String s = iter.next();
     ...
    }

Обратите внимание, что если вам нужно удалить элементы во время итерации, вам нужно использовать Iterator .

Например,

List<String> list = getMyListofStrings(); 

    for (Iterator<String> iter = list.iterator(); iter.hasNext(); ) 
    {
        String s = iter.next();
        if (someCondition) {
            iter.remove(); 
        }
    }

Вы не можете использовать для (String s: myList) , чтобы удалить элемент в списке.
Также обратите внимание, что при итерации по массиву foreach (или расширенный for) может использоваться только для получения элементов, вы не можете изменять элементы в массиве.
Для получения дополнительной информации см. это .

3
ответ дан 29 November 2019 в 04:50
поделиться

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

0
ответ дан 29 November 2019 в 04:50
поделиться

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

Итерация по коллекции уродливее, чем нужно

Так и есть...

Итератор - это просто беспорядок. Более того, это возможность для ошибки. Переменная итератора встречается три раза в каждом цикле: это два шанса ошибиться. Конструкция for-each избавляет от беспорядка и возможности ошибки.

Точно

Когда вы видите двоеточие (:), читайте его как "в". Приведенный выше цикл читается как "for each TimerTask t in c.". Как видите, конструкция for-each прекрасно сочетается с дженериками. Она сохраняет всю безопасность типов и при этом устраняет остальной беспорядок. Поскольку вам не нужно объявлять итератор, вам не нужно предоставлять для него родовое объявление. (Компилятор делает это за вашей спиной, но вам не нужно беспокоиться об этом).

Я хотел бы подытожить это больше, но я думаю, что эта страница делает это практически идеально.

4
ответ дан 29 November 2019 в 04:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: