Project Reactor:设计反应式 API

Project Reactor: Designing a reactive API

我有一个地图函数,定义如下:Mono<OUT> map(IN in)

这是一个具体的例子:

public Mono<Integer> map(String s) {
            return Mono.fromCallable(() -> {
                try {
                    Thread.sleep(1_000); // simulate HTTP request
                    return 1;
                } catch (Exception e) {}

                return -1; // need to return something.
            });
        }

问题是如果出现错误(即IOException),我们仍然需要return一些输出。也有可能没有答案(但没有发生错误)

一个解决方案可能是 Optional::empty,但我认为它很麻烦。最好,如果发生错误,我想 return Mono::empty

原因是,Mono::empty 未经任何进一步处理就被订阅者使用。这是一个例子:

Flux.just(
                Mono.just("123"),
                Mono.empty(),
                Mono.just("456")
        ).flatMap(s -> s)
                .subscribe(System.out::println);

输出将是:

123
456

如何实现相同的行为?

map 应该是什么样子?

编辑:
重新考虑一下,也许我最好 return 一些容器(如 Optional)或一个可以为空的自定义容器(Result)。

如果我没理解错的话,这是你需要的:

return Mono.fromCallable(() -> {  
    Thread.sleep(1_000); // simulate HTTP request
    return 1;
}).onErrorResume(_ -> Mono.empty())