我有两个测试功能,我希望返回相同的结果。第一个(monotest3(在" .then(("方法中使用lambda表达式。第二个没有。
为什么我会得到结果?
使用Reactivex和Lambda表达式工作时有些事情和不做什么?
在Monotest 3下方的代码中产生
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();
}
实际上在3.0.7
中弃用了此Mono.then(Function)
,并且将在3.1.0
中删除,因为它的行为与Mono
中的所有其他then
方法略有不同,因此我们预见人们像您一样感到困惑。
在3.1.0中(当前在里程碑2中,因此3.1.0.M2
(现在称为flatMap
,返回Flux
的旧flatmap现在是flatMapMany
。
这可以更好地传达正确的语义,如果您对flatMap
有所了解,那么您可以正确地推断出"持续单声道"只能生成并订阅源 Mono
被重视时。
换句话说,调用Mono.just("foo").then().then(v -> {...})
(3.0.x版本(或Mono.just("foo").then().flatMap(v -> {...})
(3.1.0版本(没有任何意义,因为第一个then()
具有没有发出值的效果。没有一个值,lambda并未被调用(其角色是将值转换为持续的单声道。出于相同的原因致电Mono.empty().then(v -> {})
毫无意义。