如何在多个Mono运算符中重用变量?

时间:2019-04-16 08:54:20

标签: java reactive-programming project-reactor

[可能重复,但到目前为止我还没有找到]

考虑以下代码:

Mono.just(myVar)
    .flatMap(MyClass::heavyOperation)
    .flatMap(MyClass::anotherHeavyOperation)
    .flatMap(res -> doSomething(res, MyClass.heavyOperation(myVar)));

出于性能考虑,我不想用相同的输入呼叫两次MyClass.heavyOperation(myVar)

如何在第四次操作中重用第二次操作的结果? 我想做这样的事,这是被禁止的:

Object myObj;
Mono.just(myVar)
    .flatMap(var -> {
               myObj = MyClass.heavyOperation(var);                  
               return myObj;
               })
    .flatMap(MyClass::anotherHeavyOperation)
    .flatMap(res -> doSomething(res, myObj));

4 个答案:

答案 0 :(得分:3)

最好的解决方案可能是将所有使用myObj的内容放在同一管道步骤中。

赞:

Mono.just(myVar)
    .flatMap(MyClass::heavyOperation)
    .flatMap(myObj -> MyClass.anotherHeavyOperation(myObj)
        .flatMap(res -> doSomething(res, myObj)));

使用myObj的步骤又可以分解为许多较小的子管道。

答案 1 :(得分:2)

您可以在第二个平面图中创建一个元组:

Mono.just(myVar)
    .flatMap(MyClass::heavyOperation)
    .flatMap(x -> Tuples.of(x, MyClass.anotherHeavyOperation(myVar))
    .flatMap(res -> doSomething(res.getT2(), res.getT1()));

答案 2 :(得分:2)

考虑保留范围:

Mono.just(myVar)
    .flatMap(var -> {
        Object myObj = MyClass.heavyOperation(var);                  
        return MyClass.anotherHeavyOperation(myObj)
            .flatMap(res -> doSomething(res, myObj));
    });

答案 3 :(得分:0)

您可以将Mono保存为变量,然后在Mono之后使用anotherHeavyOperation再次将其压缩。

var heavyOperation = Mono.just(myVar)
    .flatMap(MyClass::heavyOperation)
    .cache();

heavyOperation
   .flatMap(MyClass::anotherHeavyOperation)
   .zipWith(heavyOperation, (res, ho) -> doSomething(res, ho));