如何保持反应堆中所有后续阶段的转化结果

时间:2018-08-29 17:13:58

标签: java spring reactive-programming project-reactor

假设我有一个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 :(得分:1)

我认为解决此问题的最简单方法是考虑到您需要在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))
    );

NB:我认为您由于某种原因无法将不同的地图函数合并在一起,例如代码段的简化

答案 1 :(得分:0)

我将把您的map1,map2,map3和map4合并到一个map函数中,因为这四个函数相互依赖

但是,如果您坚持使用4个独立的函数,则可以使用tuple沿着响应流传递上下文,例如:

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;
}