[可能重复,但到目前为止我还没有找到]
考虑以下代码:
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));
答案 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));