IntelliJ предлагает заменить цикл while на каждый цикл.Зачем? - PullRequest
22 голосов
/ 11 октября 2011
    ArrayList<Object> list = new ArrayList<Object>();
    list.add(12);
    list.add("Hello");
    list.add(true);
    list.add('c');

    Iterator iterator = list.iterator();
    while(iterator.hasNext())
    {
        System.out.println(iterator.next().toString());
    }

Когда я ввожу этот Java-код в IntelliJ IDEA, функция анализа кода предлагает заменить цикл while на каждый цикл, поскольку я выполняю итерацию в коллекции. Почему это?

Ответы [ 4 ]

21 голосов
/ 11 октября 2011

Это то, что он хочет, чтобы вы использовали:

for (Object o : list)
{
    System.out.println(o.toString());
}

Это на языке, начиная с Java 1.5, и является идиоматическим паттерном.Итератор нужен только в том случае, если вам нужен доступ к другим методам итератора (например, remove()).

14 голосов
/ 11 октября 2011

Потому что вы менее склонны совершать ошибки, и это выглядит лучше; )

for( Object obj : list ) {
  System.out.println( obj.toString() );
}
11 голосов
/ 11 октября 2011

, поскольку у вас есть инспекционные средства для миграции языка Java - цикл while можно заменить на 'для каждого' активный (по умолчанию), описание равно

Эта проверка отчетов для циклов, которые повторяютсяколлекции или массивы, и могут быть заменены синтаксисом «для каждого», доступным в Java 5 и новее.Параметр Report java.util.List проиндексированных циклов отвечает за поиск циклов, включающих вызовы list.get (index).Эти циклы обычно можно заменить на циклы foreach, если они не изменяют базовый список в процессе, например, вызывая list.remove (index).В последнем случае цикл foreach может выдавать исключение ConcurrentModificationException.Эта проверка только сообщает, если проект или модуль настроен на использование языкового уровня 5.0 или выше.

, поэтому, если вы не хотите, чтобы это было сказано, снимите этот флажок в конфигурации Inspections

2 голосов
/ 11 октября 2011

Цикл foreach короче для записи и, следовательно, легче для чтения.

...