Каковы преимущества Enhanced для цикла и итератора в Java? - PullRequest
23 голосов
/ 25 июля 2010

Может ли кто-нибудь указать мне, каковы преимущества Enhanced for loop и Iterators в java +5?

Ответы [ 12 ]

21 голосов
/ 25 июля 2010

Сильные и слабые стороны довольно хорошо обобщены в Стивене Колебурне (Joda-Time, JSR-310 и т. Д.) Улучшено для каждого элемента управления итерации цикла Предложение по расширению его в Java 7:

ОСОБЕННОСТИ:

Расширяет цикл Java 5 for-each для предоставления доступа к индекс цикла, является ли это первым или последней итерации, и удалить текущий товар.

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

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

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

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

ОСНОВНАЯ ВЫГОДА:

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

...

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

Смотри также

12 голосов
/ 25 июля 2010

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

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

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

for(int i=0; i < list.size(); ++i){
  ....
}
4 голосов
/ 25 июля 2010

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

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

Так верно ..

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

Точно

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

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

3 голосов
/ 25 июля 2010

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

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

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(); 
        }
    }

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

2 голосов
/ 25 июля 2010

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

1 голос
/ 01 января 2011

Основным недостатком является создание итератора, которого нет в цикле на основе индекса. Обычно это нормально, но в разделах, критичных к производительности (например, в приложении реального времени, когда оно должно запускаться несколько сотен раз в секунду), это может привести к серьезному вмешательству GC…

1 голос
/ 25 июля 2010

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

Кроме того, он также исключает возможный сценарий ошибки «индекс за границей». Например, когда вы выполняете список вручную, вы можете использовать переменную индекса неправильно, например:

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

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

0 голосов
/ 15 июня 2012

Усовершенствованный цикл for предлагает следующие основные преимущества:

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

Устраняет повторное вычисление list.size() на каждой итерации в не расширенной версии выше. Это преимущество в производительности, которое имеет значение.

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

int size = list.size();
for (int i=0; i <= size; i++)
0 голосов
/ 25 июля 2010

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

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

0 голосов
/ 25 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...