Недавно я начал использовать Project Reactor и придумал сценарий, который не могу понять.
По сути, я хотел бы сгруппировать определенный поток, а затем получить хэш-карту, например grouping key -> List of grouped values
. Я играл с API, но самое дальнее, что у меня есть, это либо получение значений, либо ключей, либо количества, но не той структуры данных, которую я хочу. Это будет код, например, для получения значений:
var elements = new ArrayList<Integer>();
Flux.just(-1, -2, -3, 1, 2, 3)
.groupBy(val -> val.compareTo(0))
.flatMap(Flux::collectList)
.subscribe(elements::addAll);
Тест, который я хотел бы пройти, следующий:
@Test
public void groupBy() {
var elements = new HashMap<Integer, List<Integer>>();
Flux.just(-1, -2, -3, 1, 2, 3)
.groupBy(val -> val.compareTo(0))
// Do something here ...
.subscribe(...);
assertThat(elements).containsKeys(-1, 1);
assertThat(elements.get(-1)).containsExactly(-1, -2, -3);
assertThat(elements.get(1)).containsExactly(1, 2, 3);
}
Как я мог добиться последнего?
Рассматривали ли вы возможность использования Поток # подключение? Он принимает Collector
, тот же тип, что и Stream
. Также есть Flux#collectMap
.
Кроме того, если вам нужна поток такая карта, вы можете использовать Флюс#скан.
groupBy
полезен, когда вам нужно «направить» ваши сигналы по ключу и иметь Flux
по ключу, но он не предназначен для использования для создания коллекций данных.
У меня было ощущение, что я немного напрягаю
groupBy
, но я не был уверен. Спасибо за предложения!