Практическая задача: разбор кода java

В данном коде происходит модификация списка names во время итерации по нему через Stream API.

Короткий ответ

Что ответить на собеседовании

В данном коде происходит модификация списка names во время итерации по нему через Stream API.

Подробный разбор

Ответ с пояснениями

Условие

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

public class StreamTest {
    public static void main(String[] args) {
        List<String> names = new ArrayList<>();
        names.add("Ivan");
        names.add("Max");
        names.add("Alex");

        names.stream().forEach(name -> {
            System.out.println(name);
            names.add(name + " the Great");
        });
        System.out.println(names);
    }
}

Ответ

В данном коде происходит модификация списка names во время итерации по нему через Stream API.

Java Stream не поддерживает изменение коллекции во время её обработки — это приведёт к ConcurrentModificationException.

В вашем примере:

names.stream().forEach(name -> {
    System.out.println(name);
    names.add(name + " the Great");
});

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

Если запустить этот код, вы получите:

Exception in thread "main" java.util.ConcurrentModificationException
    at java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1043)
    at java.base/java.util.ArrayList$Itr.next(ArrayList.java:997)
    at ...

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

List<String> additions = new ArrayList<>();
names.stream().forEach(name -> {
    System.out.println(name);
    additions.add(name + " the Great");
});
names.addAll(additions);
System.out.println(names);

Так вы безопасно расширите список после обхода.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее