阅读 Mono
类的文档并查看图表。他们对行为的解释非常清楚。几乎没有明显的差异,但它们仍然是:
-
Mono::d oOnNext
在成功发出数据时触发,这意味着数据可用且存在。
-
Mono::d oOnSuccess
在成功完成时触发 - 结果为 or 或 ,这意味着无论数据的状态如何,处理本身都已成功完成,尽管数据不可用或不存在,但管道本身成功。Mono
T
null
-
Mono::然后
作为方法链的末端返回完成和错误信号。Mono<Void>
- 请注意,此处的有效负载被主动丢弃,这就是为什么从 .请注意,上述两种方法不会丢弃有效负载。
Mono<Void>
Mono<T>
这个答案缺乏一个适当的说明性示例,所以我即将修复它:
非空单声道
在成功发出数据时保存值触发器的 A。这可能会使 混淆 ,但与此类触发器相反,当发出任何成功的值(包括空值)时,将触发该触发器,该值仍然有效。Mono
doOnNext
doOnSuccess
doOnNext
Mono
Mono.just("Hello World")
.doOnNext(i -> System.out.println("On next: " + i))
.doOnSuccess(i -> System.out.println("On success: " + i))
.doOnError(i -> System.out.println("On error: " + i))
.block();
On next: Hello World
On success: Hello World
空单声道
请记住,尽管 是空的 (),但它仍然是触发 的有效响应,但是不是 ,空可以理解为具有有效响应的响应,该响应不表示包含有用值的所需输出。它的工作原理与 相同。是成功的,但没有会触发的真正有用的值,因为它根本不发出任何值。Mono
Mono.empty()
doOnSuccess
doOnNext
Mono
Optional.empty()
Mono
doOnNext
Mono.empty()
.doOnNext(i -> System.out.println("On next: " + i))
.doOnSuccess(i -> System.out.println("On success: " + i))
.doOnError(i -> System.out.println("On error: " + i))
.block();
Mono.just("Hello World")
.mapNotNull(s -> null)
.doOnNext(i -> System.out.println("On next: " + i))
.doOnSuccess(i -> System.out.println("On success: " + i))
.doOnError(i -> System.out.println("On error: " + i))
.block();
两者都产生相同的输出:
On success: null
错误的单声道
为了完整起见,与空的相反,错误不会触发其中任何一个,而是会触发:Mono
doOnNext
doOnSuccess
doOnError
Mono.error(new RuntimeException("Something wrong"))
.doOnNext(i -> System.out.println("On next: " + i))
.doOnSuccess(i -> System.out.println("On success: " + i))
.doOnError(i -> System.out.println("On error: " + i))
.block();
On error: java.lang.RuntimeException: Something wrong