Как сохранить результат преобразования для всех последующих стадий в реакторе - PullRequest
0 голосов
/ 29 августа 2018

Допустим, у меня есть поток Reactor, который состоит из 4 этапов:

Mono.just(event)
.map(this::map1)
.map(this::map2)
.map(this::map3)
.map(this::map4)

Я хочу, чтобы результат this::map1 был доступен для this::map2, this::map3 and this::map4 этапов. Есть ли простой способ сделать это с помощью Reactor?

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Я думаю, что самый простой способ решения этой проблемы - учесть, что вам нужно ввести какую-то «границу» вокруг map1. Это может быть достигнуто с помощью flatMap:

Mono.just(event)
    .map(this::map1)
    .flatMap(v1 -> Mono.just(v1)
        .map(v2 -> map2(v2, v1))
        .map(v3 -> map3(v3, v1))
        .map(v4 -> map4(v4, v1))
    );

Примечание: я предположил, что вы не можете объединить различные функции карты по какой-то причине, например, для упрощения фрагмента

0 голосов
/ 30 августа 2018

Я бы объединил ваши map1, map2, map3 и map4 в одну функцию карты, так как 4 функции зависят друг от друга

Но если вы настаиваете на использовании 4 отдельных функций, вы можете передать контекст вдоль реактивного потока, используя кортеж , например:

private Tuple2<String, HashMap> map3(Tuple2<String, HashMap> inputTuple) {
        String input = inputTuple.getT1();
        HashMap context = inputTuple.getT2();
        // mapping example
        String result = input + context.get("result1") +  "mappingExample";
        context.put("result3", result);
        return Tuples.of(result, context);
    }

Или просто простая карта, которая содержит все ваши результаты, например:

private HashMap<String, String> map3(HashMap<String, String> input) {
    String result3 = input.get("result2") + input.get("result1");
    input.put("result3", result3);
    return input;
}
...