Spring Webflux:嵌套 Flatmap 替代品

问题描述 投票:0回答:2

我有一个场景,第二个单声道依赖于第一个单声道,而 ThridMono 调用依赖于第二个单声道输出。

我写的代码如下。

  firstMono.flatMap{

    val secondMono = callWebservice(firstMono)

    val thrirdMono = secondMono.flatMap { secondMonoResponse ->
        if (secondMonoResponse.getName.equals("ABC")) {
            callAnotherWebService(secondMon)
        } else {
            secondMono
        }
    }
}

我怎样才能避免这里出现第二个 flatMap?。有没有办法可以在没有嵌套的 flatMap 的情况下做到这一点。我应该只在满足条件的情况下调用 thrirdMono 。

java kotlin reactive-programming spring-webflux project-reactor
2个回答
1
投票

答案可能会有所不同,具体取决于每个 Mono 的具体性能。 然而,当我查看代码片段时,我没有看到在第一个Mono上调用

flatMap{}
的意义,所以它可能看起来如下:

callWebservice(firstMono)
  .flatMap { secondMonoResponse ->
    if (secondMonoResponse.name == "ABC" ) {
      callAnotherWebService(secondMono)
    } else {
      secondMono
    }
  }

另一方面,这里也可以使用 .zip 方法:

val secondMono = callWebservice(firstMono)
Mono.zip(firstMono, callWebservice(firstMono))
  .flatMap { 
    val secondMonoResponse = it.t2
    if (secondMonoResponse.name == "ABC" ) {
      callAnotherWebService(secondMono)
    } else {
      secondMono
    }
  }

注意:我删除了

val thrirdMono
,因为上面的代码片段不会编译,因为返回类型是Unit(而不是Mono)。


0
投票

你可以像这样做一个调用堆栈:

Mono<MonoCustom> thirdMono = firstMono.map(this::callWebservice)
                .map(secondMonoResponse -> {
                    if (secondMonoResponse.getName().equalsIgnoreCase("ABC")) {
                        return callAnotherWebService(secondMonoResponse);
                    }
                    return secondMonoResponse;
                });

所以结果会是这样的:

package com.example;

import reactor.core.publisher.Mono;

public class SomeClass {

    private Mono<MonoCustom> getThirdMono(Mono<MonoCustom> firstMono) {
        return firstMono.map(this::callWebservice)
                .map(secondMonoResponse -> {
                    if (secondMonoResponse.getName().equalsIgnoreCase("ABC")) {
                        return callAnotherWebService(secondMonoResponse);
                    }
                    return secondMonoResponse;
                });
    }

    private MonoCustom callWebservice(MonoCustom firstMonoResponse) {
        return firstMonoResponse;
    }

    private MonoCustom callAnotherWebService(MonoCustom secondMonoResponse) {
        return secondMonoResponse;
    }

    private static class MonoCustom {
        private String name;

        private MonoCustom(String name) {
            this.name = name;
        }

        public String getName() {
            return this.name;
        }
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.