java reactor filterAndMap?

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

我想用reactor实现:

for (val worker : getWorkers(request)) {
    val response = worker.tryDo(work);
    if (response != null) {
        return response;
    }
}
return null;

getWorkers可以转移返回Flux<Worker>tryDo也可以返回单声道。

关键是我想要一个或零个响应,如果当前的worker.tryDo失败,只尝试下一个。

我需要哪个操作员?我在document找不到答案。

java project-reactor
2个回答
0
投票

假设你可以重做tryWork来返回一个空的Mono,当没有工作而不是返回null时,你可以使用getWorkers(request).flatMap(worker -> worker.tryDo(work), 1).next()

1flatMap参数指示它只考虑工人1乘1.返回空单声道的工人实际上不影响flatMap的输出。 Flux.next()通过丢弃第一个元素并取消源代码来转换为Mono


0
投票

我找到了一个来自@OlegDokuka的gitter中的答案:

Mono.fromDirect(workersFlux.concatMap(worker -> 
    Mono.justOrEmpty(worker.tryDo(work))).take(1))

更新:

感谢@SimonBaslé:使用singleOrEmpty而不是fromDirect

workersFlux.concatMap(worker -> Mono.justOrEmpty(worker.tryDo(work))).take(1).singleOrEmpty()
© www.soinside.com 2019 - 2024. All rights reserved.