嗯,这听起来与反应式编程相反,但是我无法理解处理空值/异常的方法。
private static class Data {
public Mono<String> first() {
return Mono.just("first");
}
public Mono<String> second() {
return Mono.just("second");
}
public Mono<String> empty() {
return Mono.empty();
}
}
我理解,除非发布者发布活动,否则订阅者将不会采取行动。所以像这样的代码可以工作。
Data data = new Data();
data.first()
.subscribe(string -> Assertions.assertThat(string).isEqualTo("first"));
如果第一个呼叫返回空,我可以这样做。
Data data = new Data();
data.empty()
.switchIfEmpty(data.second())
.subscribe(string -> Assertions.assertThat(string).isEqualTo("second"));
但是当两个调用都返回空时(如果这是一个需要传播给用户的异常情况),我该如何处理一个案例。
Data data = new Data();
data.empty()
.switchIfEmpty(data.empty())
.handle((string, sink) -> Objects.requireNonNull(string))
.block();
在上面的例子中没有调用句柄,因为没有发布任何事件。
答案 0 :(得分:1)
正如JB Nizet指出的那样,你可以用switchIfEmpty
链接一秒Mono.error
。
或者,如果您对NoSuchElementException
感到满意,可以链接到single()
。它强制执行完全一个元素的强大契约,否则传播该标准异常。