我有两个测试函数,我期望返回相同的结果。第一个(monoTest3)在' .then()'中使用lambda表达式。方法。第二个没有。
为什么我会得到我的结果?
使用ReactiveX和lambda表达式时有什么做法和不做?
在下面的代码中,monoTest3产生了
monoVoid called
Success
----
monoVoid2 called
Success
和monoTest4产生(期望的结果):
monoVoid called
monoVoid2 called
Success
----
monoVoid2 called
monoVoid called
Success
最后是代码。
private static Mono<Void> monoVoid() {
System.out.println("monoVoid called");
return Mono.empty();
}
private static Mono<Void> monoVoid2() {
System.out.println("monoVoid2 called");
return Mono.just("Hello").then();
}
@Test
public void monoTest3() throws Exception {
monoVoid()
.then( v -> monoVoid2())
.doOnSuccess(v -> System.out.println("Success"))
.block();
System.out.println("----");
monoVoid2()
.then( v -> monoVoid())
.doOnSuccess(v -> System.out.println("Success"))
.block();
}
@Test
public void monoTest4() throws Exception {
monoVoid()
.then( MonoTest::monoVoid2 )
.doOnSuccess(v -> System.out.println("Success"))
.block();
System.out.println("----");
monoVoid2()
.then(MonoTest::monoVoid)
.doOnSuccess(v -> System.out.println("Success"))
.block();
}
答案 0 :(得分:4)
此Mono.then(Function)
实际上已在3.0.7
中弃用,并将在3.1.0
中删除,因为其行为与then
中的所有其他Mono
方法略有不同,所以我们预见到人们会像你刚才那样感到困惑。
在3.1.0中(目前在里程碑2中,所以3.1.0.M2
)现在称为flatMap
,而现在将返回Flux
的旧flatMap现在为flatMapMany
这更好地传达了正确的语义,如果您对flatMap
有所了解,那么您可以正确地推断出&#34;继续Mono&#34;只有在来源Mono
被重视时才能制作和订阅。
换句话说,调用Mono.just("foo").then().then(v -> {...})
(3.0.x版本)或Mono.just("foo").then().flatMap(v -> {...})
(3.1.0版本)没有任何意义,因为第一个then()
具有无效的效果发出的价值。没有值,lambda不会被调用(它的作用是将值转换为连续Mono 。由于同样的原因,调用Mono.empty().then(v -> {})
没有任何意义。