[英]Handling Mono Inside Flux Flatmap
我有一個字符串通量。 對於每個字符串,我必須進行遠程調用。 但問題是,進行遠程調用的方法實際上返回了一個 Mono 響應(顯然因為對應於單個請求,所以會有單個響應)。
處理這種情況的正確模式應該是什么? 我能想到的一種解決方案是對流元素進行串行(或並行)調用,並將響應減少為單個響應並返回。
這是代碼:
fluxObj.flatmap(a -> makeRemoteCall(a)//converts the Mono of the response to a Flux).reduce(...)
我無法將頭環繞在flatmap
。 makeRemoteCall
方法返回Mono
。 但是flatmap
返回響應的Flux
。 首先,為什么會發生這種情況? 其次,這是否意味着返回的Flux
包含單個響應對象(在Mono
中返回)?
如果mapper Function
返回Mono
,則意味着Flux
中的每個源元素將(最多)有一個派生值。
讓Function
返回:
Mono.empty()
)意味着該源值被“忽略”Mono
(如您的示例中)意味着此源值異步映射到另一個特定值Flux
意味着此源值異步映射到多個值例如,給定以下flatMap
:
Flux.just("A", "B")
.flatMap(v -> Mono.just("value" + v))
訂閱上述Flux<String>
並打印發出的元素將產生:
valueA
valueB
另一個有趣的例子:由於延遲,人們可能會得到無序的結果。 像這樣:
Flux.just(300, 100)
.flatMap(delay -> Mono.delay(Duration.ofMillis(delay))
.thenReturn(delay + "ms")
)
將導致Flux<String>
產生:
100ms
300ms
如果您看到文檔flatMap ,則可以找到問題的答案:
將此 Flux 發出的元素異步轉換為發布者,然后將這些內部發布者扁平化為單個 Flux,使用串聯順序並保留順序。
長話短說,
@Test
public void testFlux() {
Flux<String> oneString = Flux.just("1");
oneString
.flatMap(s -> testMono(s))
.collectList()
.subscribe(integers -> System.out.println("elements:" + integers));
}
private Mono<Integer> testMono(String s) {
return Mono.just(Integer.valueOf(s + "0"));
}
mapper - s -> testMono(s)
其中testMono(s)
是 Publisher (在您的情況下makeRemoteCall(a)
),它將我的oneString
類型oneString
為Integer 。
我將 Flux 結果收集到 List,並打印出來。 控制台輸出:
elements:[10]
這意味着flatMap
運算符之后的 result Flux 僅包含一個元素。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.