👩💻
JEP 485: Stream GatherersС выходом JDK 24 Stream API станет еще мощнее благодаря новому инструменту —
Stream Gatherers. Этот подход позволит разработчикам создавать собственные промежуточные операции в потоках, повышая гибкость и выразительность программного кода.
Почему это важно?До сих пор Stream API предлагал фиксированный набор операций, таких как map, filter, distinct, и другие. Однако некоторые задачи не могли быть легко решены встроенными методами. Например, если вы хотите выделить уникальные строки на основе их длины, это требовало сложных обходных путей:
record DistinctByLength(String str) {
@Override public boolean equals(Object obj) {
return obj instanceof DistinctByLength other && str.length() == other.str.length();
}
@Override public int hashCode() {
return str.length();
}
}
var result = Stream.of("foo", "bar", "baz", "quux")
.map(DistinctByLength::new)
.distinct()
.map(DistinctByLength::str)
.toList();
// result ==> [foo, quux]
С выходом фичи задача будет решаться гораздо проще:
var result = Stream.of("foo", "bar", "baz", "quux")
.gather(Gatherers.distinctBy(String::length))
.toList();
// result ==> [foo, quux]
Как работает Gatherer?Gatherer — это интерфейс, задающий логику преобразования элементов потока. Его работа строится на четырех функциях:
1.
initializer — создает объект для хранения состояния.
2.
integrator — обрабатывает элементы потока, при необходимости записывая данные в состояние.
3.
combiner — объединяет результаты для параллельных потоков.
4.
finisher — выполняет финальные действия, такие как добавление оставшихся данных.
Например, gatherer windowFixed группирует элементы в списки фиксированного размера:
Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9)
.gather(Gatherers.windowFixed(3))
.toList();
// result ==> [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Что это дает разработчику?1.
Гибкость: Возможность определять операции любой сложности.
2.
Параллельность: Поддержка многопоточности при использовании combiner.
3.
Снижение сложности: Простое выражение сложных операций без использования обходных решений.
4.
Поддержка Stateful Stream Processing подхода
ЗаключениеJEP 485 — это достойный вклад в развитие Stream API, предоставляющий разработчикам инструменты для создания более выразительных и производительных потоков.
🔗
С полным описанием JEP можно ознакомиться по ссылке: https://openjdk.org/jeps/485#Java #JEP