Одним из наиболее важных нововведений, на мой взгляд, в стандартной библиотеке в грядущем релизе JDK 25 станут сборщики стримов (JEP 485 Stream Gatherers). Да, стабильными они стали ещё в JDK 24, но для себя я рассматриваю только LTS-релизы. Сборщики стримов описываются типизированным интерфейсом Gatherer<T, A, R>, где T - тип входящего элемента стрима, R - тип выходящего элемента, а A - потенциально изменяемое состояние сборщика. Внутри Gatherer используются четыре компонента: Создать сборщик стрима можно при помощи метода Gatherer.of (для сборщиков без состояния) или Gatherer.ofSequential (для сборщиков с состоянием), передав в качестве аргумента, как минимум, функцию-интегратор или все вышеуказанные компоненты. Состояние позволяет реализовывать логику, опирающуюся на ранее обработанные элементы стрима, например исключение дублирующихся элементов из стрима. Для применения сборщика к стриму нужно передать его в промежуточном метода Stream.gather(). Ниже приведён пример сборщика которы