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

问题描述 投票:0回答:2

假设我有一个由4个阶段组成的Reactor流:

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有什么简单的方法吗?

java spring reactive-programming project-reactor
2个回答
0
投票

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

但是如果你坚持使用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;
}

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

注意:我假设你不能出于某种原因将不同的地图功能合并在一起,比如简化代码片段

© www.soinside.com 2019 - 2024. All rights reserved.