Немодифицируемые Collector-ы
Сбор напрямую в немодифицируемый список с помощью stream.toList().
Сравнение кода
✕ Java 8
List<String> list = stream.collect(
Collectors.collectingAndThen(
Collectors.toList(),
Collections::unmodifiableList
)
);
✓ Java 16+
List<String> list = stream.toList();
Заметили проблему в этом коде? Сообщите нам.
Почему современный подход лучше
Максимально краткий
stream.toList() не требует ни collect(), ни импорта Collectors.
Неизменяемый
Результат нельзя изменить — никаких случайных мутаций.
Читаемый
Читается естественно как завершающий шаг любого потокового конвейера.
Старый подход
collectingAndThen
Современный подход
stream.toList()
Начиная с JDK
16
Сложность
Средний
Поддержка JDK
Немодифицируемые Collector-ы
Доступно
Широко доступно начиная с JDK 16 (март 2021)
Как это работает
Java 10 добавила toUnmodifiableList(), toUnmodifiableSet() и toUnmodifiableMap() для замены многословной обёртки collectingAndThen. Для списков stream.toList() из Java 16 предлагает ещё более простую альтернативу — без вызова collect(). Для других типов коллекций использовать toUnmodifiableSet() и toUnmodifiableMap().
Связанная документация
Доказательство