java 反应堆 filterAndMap?

java reactor filterAndMap?

我想用reactor实现:

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

getWorkers可以转returnFlux<Worker>,tryDo也可以return单声道

关键是我只想要一个或零个响应,只有在当前 worker.tryDo 失败时才尝试下一个。

我需要哪个运营商?我在 document.

中找不到答案

假设您可以将 tryWork 重做为 return 一个在没有工作时为空的 Mono 而不是 returning null,您可以使用 getWorkers(request).flatMap(worker -> worker.tryDo(work), 1).next()

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

我在 gitter 中找到了答案,来自@OlegDokuka:

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

更新:

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

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