Java Mono#then和Mono#and的区别是什么?

Java Mono#then和Mono#and的区别是什么?,java,reactive-programming,project-reactor,Java,Reactive Programming,Project Reactor,鉴于以下情况: Mono mono1=Mono.fromRunnable(()->{ System.out.println(“sleep1”); 试一试{ 睡眠(1000); }捕捉(中断异常e){ 抛出新的非法状态异常(e); } System.out.println(“mono1”); }); Mono mono2=Mono.fromRunnable(()->{ System.out.println(“mono2”); }); Mono mono3=Mono.fromRunnable(()-

鉴于以下情况:

Mono mono1=Mono.fromRunnable(()->{
System.out.println(“sleep1”);
试一试{
睡眠(1000);
}捕捉(中断异常e){
抛出新的非法状态异常(e);
}
System.out.println(“mono1”);
});
Mono mono2=Mono.fromRunnable(()->{
System.out.println(“mono2”);
});
Mono mono3=Mono.fromRunnable(()->{
System.out.println(“mono3”);
});
两者:

mono1
.然后(2)
.然后(3)
.block();
以及:

mono1
.及(2)
.及(3)
.block();
具有相同的输出:

睡眠
mono1
mono2
mono3
在这种情况下和之间有什么区别


发件人:

[如果您]有一个序列,但[您]对值不感兴趣,[您]想在最后切换到另一个单声道,[使用]
Mono,然后(Mono)

[如果您]希望通过将其从1个Mono和任何源的终止协调到一个Mono来合并发布者,[使用]
Mono#和

这无助于我找到这样一种情况,即
#和
#然后
的行为很不幸会有所不同。

Mono#和
只是“将当前Mono和另一个源的终止信号连接到返回的空Mono中”。它总是返回
Mono
,并且只允许您协调两个
Mono
s的终止

Mono#然后
允许将两个
Mono
s链接在一起,最终结果将由作为参数传递的
Mono
确定。从这个意义上说,
Mono#然后
Mono#flatMap
的一个更原始的版本,唯一的区别是在
Mono#flatMap
的内部,您可以在一个链中访问上一个
Mono
的结果,您可以将其转换为另一个
Mono
实例

除此之外,使用
Mono#则
操作将按顺序执行,而使用
Mono#和
则无法保证订购(至少从文档中)