Вопрос проверяет понимание различий между классическим и новым API Stream и влияния на изменяемость коллекций.
collect(toList()) возвращает изменяемый список. toList() возвращает неизменяемый список. toList() появился в новых версиях Java и короче по синтаксису. Поведение collect(toList()) зависит от реализации. Поэтому важно понимать, какой список вы получаете.
Хотя оба способа выглядят похожими, между ними есть важные различия.
collect(toList()) — классический способ сбора элементов стрима в список.toList() — удобный метод Stream API, возвращающий неизменяемую коллекцию.
Перед перечислением важно отметить: различие не только в синтаксисе.
collect(Collectors.toList())
обычно возвращает ArrayList
список можно модифицировать
toList()
возвращает immutable список
попытка изменения приведёт к ошибке
collect(toList())
доступен давно
toList()
появился в Java 16
toList()
чётко гарантирует неизменяемость
collect(toList())
конкретный тип не гарантирован
Нужен изменяемый список → collect(toList())
Нужна безопасность и иммутабельность → toList()
toList() — современный и безопасный способ, а collect(toList()) остаётся гибким вариантом, когда требуется изменяемость.