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())
我有一个地图函数,定义如下: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())