有人能解释Reactor Mono流中的.then()方法的做法和不做吗?

时间:2017-06-22 19:15:50

标签: spring lambda java-8 reactive-programming project-reactor

我有两个测试函数,我期望返回相同的结果。第一个(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();

}

1 个答案:

答案 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 -> {})没有任何意义。