IntelliJ предлагает заменить цикл while на a для каждого цикла. Почему?

#java #loops #foreach #intellij-idea #while-loop

#java #циклы #foreach #intellij-идея #цикл while

Вопрос:

     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 на a для каждого цикла, поскольку я выполняю итерацию по коллекции. Почему это так?

Комментарии:

1. Когда вам приходится использовать итератор, например, когда вы используете его метод remove() , вы не можете выиграть в любом случае. В этом случае в цикле for говорится: «в цикле for отсутствует обновление». Мне нравится проверка кода, но я обычно нахожу IntelliJ бесполезно шумным.

Ответ №1:

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

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

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

Комментарии:

1. Это просто и выглядит хорошо, но дает ConcurrentModificationException .

2. Этот код ничего не изменяет. Он не может выдать это исключение.

3. Проблема с использованием for (Object o: list) заключается в том, что если массив будет изменен / доступен позже (это часто случается в играх), он выдаст исключение. Если вы используете итератор с hasNext(), этого не произойдет. Таким образом, предложение неверно.

Ответ №2:

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

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

Комментарии:

1. Простите за мое невежество, но почему цикл ‘while’ более подвержен ошибкам, чем цикл ‘for each’?

2. С циклом while вы должны обрабатывать итератор самостоятельно и можете забыть получить следующий элемент. С синтаксисом for вы не можете «забыть» его. У вас есть цикл, который будет выводить каждый элемент списка ровно один раз. Вам не нужно ни о чем заботиться.

Ответ №3:

поскольку у вас есть средства миграции языка Java для проверки — цикл ‘while’ заменяется на ‘for each’ active (который используется по умолчанию), описание

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

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

Комментарии:

1. Спасибо, я новичок в IntelliJ и Java в целом. Я попросил IntelliJ дать мне несколько полезных советов о том, как улучшить мой код, но приведенное вами описание, похоже, не объясняет, почему замена циклов ‘while’ циклами ‘for each’ для коллекций / массивов является лучшей идеей.

2. чтобы ответить на это, я бы посоветовал посмотреть, что сказали другие люди, хотя и по другой причине, если у вас есть особые требования к индексированному доступу. Примером может быть предотвращение выделения объекта, возникающего при доступе к arraylist через foreach . Я не думаю, что у вас будет такое требование, если вы новичок в java, поэтому просто используйте foreach . Еще одна причина использования foreach заключается в том, что он оставляет решение об оптимизации на JVM, которое, учитывая, что jvm является динамическим оптимизатором, также является идиоматичным для языка jvm.

Ответ №4:

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

Ответ №5:

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

Комментарии:

1. Можете ли вы предоставить источник для этого? Использование циклов for-each уже давно является идиоматическим способом обработки циклов такого рода и гораздо более простым и кратким, чем использование цикла while, и это первое, что я слышал о неоптимизации циклов for-each. Любая разница здесь сводилась бы к микрооптимизации, о которой обычным пользователям не нужно было бы беспокоиться или заботиться .

2. Да, обычному пользователю не нужно беспокоиться о микрооптимизации, но рекомендуется следовать этим нормам и пытаться создать идеальный код для организации. Конечно, такие организации, как facebook, google, которые имеют дело с огромными объемами данных, хотели бы, чтобы их сотрудники знали такие вещи и, следовательно, хорошую практику. подробное исследование по сравнению можно найти по ссылке ниже: lihaoyi.com/post /.