当前位置: 首页 > 知识库问答 >
问题:

两个单声道与条件的组合

堵雅健
2023-03-14

我想根据一些条件将结果从两个单声道组合起来。这两个单声道都是网络客户端调用的结果:

  • 第一个是期望快速响应的单个呼叫。
  • 第二个是几个响应缓慢的电话的组合。

如果第一个单声道的结果满足某些条件,则“取消”第二个单声道的想法可以节省时间并避免不必要的网络调用。如果第一个单声道的结果不够,请使用第二个单声道。

一个静态编程语言代码示例来解释我的想法:

fun getResult(): Mono<Result> {

    val trivialResultMono: Mono<Result> = webClient.getResult()

    val nonTrivialResultMono: Mono<Result> = webClient
            .getResult()
            .flatMap { webClient.getResult1(it) }
            .flatMap { webClient.getResult2(it) }
            .flatMap { webClient.getResult2(it) }

    //here I need to check if trivial result satisfies some condition,
    //for example trivialResult.size > 5 if it's true I just return
    //trivialResultMono from getResult() function, 
    //it it's false something like this:
    return Mono.zip(trivialResultMono, nonTrivialResultMono) { trivialResult, nonTrivialResult ->
        trivialResult + nonTrivialResult
    }

}

更新:

更清楚的是,让我们假设平凡的结果在1秒内出现,非平凡的结果在2秒内出现。我想在1秒钟内得到我的最终结果,以防<代码>平凡的结果。大小

仅使用单声道。zip(TritileResultMono,nonTrivialResultMono)我总是会在2秒钟内得到最终结果。

使用html" target="_blank">过滤器开关,如果trivialResult.size,则需要1秒


共有2个答案

澹台岳
2023-03-14

您可以使用flatMap和map来实现这一点:

trivial.flatMap(trivialResult -> {
  if (trivialResult.size > 5) {
    return Mono.just(trivialResult);
  } else {
    return nonTrivial.map(nonTrivialResult -> trivialResult + nonTrivialResult);
  }
});
彭弘方
2023-03-14

您可以过滤平凡的ResultMono,并应用switchIfEmpty操作符

return trivialResultMono
        .filter(trivialResult -> trivialResult.size > 5)
        .switchIfEmpty(Mono.zip(...))

合并方法更新:

Mono<Result> zipResultMono = Mono.zip...

return Flux.merge(
        trivialResultMono.map(trivialResult -> Tuples.of(1, trivialResult)),
        zipResultMono.map(zipResult -> Tuples.of(2, zipResult)))
        .filter(tuple ->
                (tuple.getT1().equals(1) && tuple.getT2().size > 5) ||
                        tuple.getT1().equals(2))
        .next()
        .map(Tuple2::getT2);

如果zipResult的大小始终大于5,则可以跳过转换为Tuple2

 类似资料:
  • 我最近一直在学习使用Java中的reactor库和Spring框架进行反应式编程,并且在很大程度上我已经能够掌握它。然而,我发现自己有好几次遇到同样的情况,我想知道我哪里出了问题。 我正在努力解决的问题的要点是,我经常想用mono做一些事情,比如找到一些补充数据,然后将其添加回原始mono中。zip函数在我看来是一个理想的候选函数,但最终我订阅了两次原始mono,这不是我的意图。 这里有一个人为的

  • 我面临的情况是,我必须使用2 Mono,其中第二个将依赖于第一个的Id字段,并在第一个Mono的主体中返回第二个的响应。 例如: 然后将结果返回为 我试过了 但像这样,我只能返回第二个单声道的响应。 通过尝试Map或Flatmap,它只在第二个单声道上起作用。 请提出建议。

  • 我想创建一个SpringWebFlux服务,它将两个源的数据与一个依赖项相结合。我是Webflux的新手,所以我不知道怎么做。下面是一些伪代码来说明我要做的事情: 的结果包括我想用查找的数据的标识符。至少我想处理这两个数据集。我可以使用什么方法代替第一个?

  • 获取所有分支 遍历所有并将其添加到 返回,这是我不确定这样做是否正确的地方。但它起作用了 合并所有列表 我只是困惑,这是在我的上下文中使用的正确方式吗?或者有没有什么更好的方法来实现我正在努力做的事情?

  • 我有一个简单的任务。我想在订单中添加产品。 我还想实现的是返回更新的订单。下面的代码不能像我希望的那样工作。有时所有的产品都被保存,有时一个也没有。我使用的数据库是被动mongo。

  • 给定以下monos: 双: 和: 具有相同的输出: 和之间有什么区别,在这种情况下? 从https://projectreactor.io/docs/core/release/reference/index.html#which-operator: [如果你]有一个序列,但[你]对值不感兴趣,并且[你]想在最后切换到另一个单声道,[使用]。 [如果您]希望通过将发布者从1个Mono和任何源端协调到