Собираем GroupFlux в Hashmap по ключам

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

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
674
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Рассматривали ли вы возможность использования Поток # подключение? Он принимает Collector, тот же тип, что и Stream. Также есть Flux#collectMap.

Кроме того, если вам нужна поток такая карта, вы можете использовать Флюс#скан.

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

У меня было ощущение, что я немного напрягаю groupBy, но я не был уверен. Спасибо за предложения!

Javier García Manzano 08.04.2019 10:53

Другие вопросы по теме