我正在使用Spring webflux進行反應式流作業。我想從反應式管道的中間提取一個變數(name),并在不同的地方使用它,如下所示。
public class Example {
public Mono<String> test() {
字串名稱。
return Mono.just("某個隨機字串")
.map(s -> {
name = s.toUpperCase();
return name。
}).map(...)
.map(...)
.flatMap(...)
.map(...)
.map(result -> result name)
.doOnSuccess(res -> asyncPublish(name))。
public void asyncPublish(String name) {
//向訊息佇列異步寫入的邏輯。
}
}
}
上述代碼無法作業。這是一個矯揉造作的例子,但顯示了我想要實作的目標。
注意:我不想使用多個zip運算子來將name一直帶到我想使用它的最后一張地圖。有沒有一種方法可以讓我把它存盤在一個變數中,然后在其他地方使用它,無論我需要它。
uj5u.com熱心網友回復:
你可以使用例如Tuple2來傳遞name的值以及通過鏈修改的資料。
return Mono.just("一些隨機字串")
.map(s -> s.toUpperCase())
.map(s -> Tuples.of(s, x(s))) //鑒于x(s)是這個map陳述句的轉換。
.map(...) ///保持Tuple的第一個槽為`name`的值...。
.flatMap(...) ///將帶有`name`值的元組保留在第一個槽中...。
.map(resultTuple -> Tuples.of(resultTuple.getT1(), resultTuple.getT2() resultTuple.getT1() ) //保持Tuple的第一個槽中有`name`的值...。
.doOnSuccess(resultTuple -> asyncPublish(resultTuple.getT1())
.map(resultTuple -> resultTuple.getT2()); //萬一回傳的Mono應該包含修改的值...
Tuples來自reactor.util.function包,是reactor-core的一部分。
另一種方式(不使用Tuples通過鏈傳遞值)可以使用AtomicReference(但我仍然認為Tuple方式更干凈)。AtomicReference的方式可能看起來像這樣:
public Mono<String> test() {
final AtomicReference<String> nameRef = new AtomicReference<> ();
return Mono.just("某個隨機字串")
.map(s -> {
final String name = s.toUpperCase()。
nameRef.set(name)。
return name。
}).map(...)
.map(...)
.flatMap(...)
.map(...)
.map(result -> result nameRef.get())
.doOnSuccess(res -> asyncPublish(nameRef.get()) )。
public void asyncPublish(String name) {
//向訊息佇列異步寫入的邏輯。
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/324194.html
標籤:
