В данном коде происходит модификация списка names во время итерации по нему через Stream API.
Практическая задача: разбор кода java
В данном коде происходит модификация списка 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);
Так вы безопасно расширите список после обхода.