Сбор GroupFlux в Hashmap по ключам - PullRequest
0 голосов
/ 07 апреля 2019

Я недавно начал использовать 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);
}

Как я мог достичь последнего?

1 Ответ

1 голос
/ 07 апреля 2019

Рассматривали ли вы использование Flux # connect ?Он принимает Collector того же типа, что и Stream.Существует также Flux#collectMap.

Plus. Если вам нужна stream такая карта, вы можете использовать Flux # scan .

groupBy полезен, когда вам нужно «направить» ваши сигналы по ключу и иметь Flux по ключу, но он не предназначен для использования для создания коллекций данных.

...