始终执行mono switchiffempty()

zf9nrax1  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(591)

我想这样做:

if (someObject == null) {
    return Mono.just(someId)
      .flatMap(si -> service.monoVoidMethod(si));
}
return Mono.just(someObject)
        .flatMap(so -> service.monoObjectMethod(so)
             .flatMap(so2 -> service.monoVoidMethod2(so2)))

有没有什么方法可以用更“被动”的方式来做,而不使用if语句?我试过使用mono.switchiffempty,但是当someobject不为null时,monovoidmethod和monovoidmethod2都被调用了。

return Mono.justOrEmpty(someObject)
   .flatMap(so -> service.monoObjectMethod(so)
             .flatMap(so2 -> service.monoVoidMethod2(so2)))
   .switchIfEmpty(Mono.empty().flatMap(var -> service.monoVoidMethod(si)))

我发现了一个孪生主题:mono switchiffempty()总是被调用
还尝试了mono.defer,但没有改变:

return Mono.justOrEmpty(someObject)
   .flatMap(so -> service.monoObjectMethod(so)
             .flatMap(so2 -> service.monoVoidMethod2(so2)))
   .switchIfEmpty(Mono.defer(() -> service.monoVoidMethod(si)))

当monoviodmethod2和monoviodmethod1不是void类型时,一切都很好——但这不是我的情况。在我的系统中,monovoidmethod2和monovoidmethod1返回http状态,正文为空。

yqyhoc1h

yqyhoc1h1#

你的例子没有错误。干得好

public void test(Integer integer) {
        Mono.justOrEmpty(integer)
                .flatMap(so -> Mono.just(1)
                         .flatMap(so2 -> Mono.just(3)))
                .switchIfEmpty(Mono.just(10))
                .subscribe(System.out::println);
    }

如果你执行 test(1) 然后它会打印3。另一种方式,执行 test(null) 返回一个 10 - switchIfEmpty 价值观。
---更新日期:2021年1月30日
我在考试中变了。 flatMap 因为so2返回一个空单声道。所以,两次调用 test(1) 以及 test(null) 返回10

public void test(Integer integer) {
   Mono.justOrEmpty(integer)
      .flatMap(so -> Mono.just(1)
         .flatMap(so2 -> Mono.empty()))
      .switchIfEmpty(Mono.just(10))
      .subscribe(System.out::println);
}

相关问题