首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当flatMap返回空单声道时,如何调用switchIfEmpty?

当flatMap返回空单声道时,如何调用switchIfEmpty?
EN

Stack Overflow用户
提问于 2021-03-31 05:05:43
回答 1查看 235关注 0票数 1

我的标题听起来令人困惑,所以让我用一些命令式伪代码来解释我想要做的事情

代码语言:javascript
运行
复制
Mono<Void> func() {
  Mono<MyThing> myThing = getMyThing();
  if myThing is not empty:
    return doSomething();
  else:
    return doSomethingElse();
}

这就是我在尝试进行反应性操作时遇到的问题:

代码语言:javascript
运行
复制
Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
  Mono<MyThing> myThing = getMyThing();
  return myThing
    .flatMap(thing -> {
      Mono<Void> somethingMono = doSomething();
      return somethingMono;
    })
    .switchIfEmpty(Mono.defer(() -> {
      Mono<Void> somethingElseMono = doSomethingElse();
      return somethingElseMono;
    });
}

myThing为空时,这种方法可以很好地工作。它跳过.flatMap()并执行.switchIfEmpty()语句。

但是,当myThing不为空时,它会执行.flatMap(),这正是我想要的。但是flatMap返回一个Mono<Void>,它触发后续的.switchIfEmpty()方法。

我尝试交换.flatMap().switchIfEmpty()的位置,但也不起作用,因为.switchIfEmpty()返回一个Mono<Void>,而.flatMap()需要一个Mono<MyThing>

这似乎是一个常见的模式,所以想知道什么是正确的方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-31 06:02:53

有几种方法可以做到这一点。由于您使用Mono<Void>作为返回类型,因此可以执行以下操作:

代码语言:javascript
运行
复制
getMyThing()
        .delayUntil(thing -> doSomething())
        .switchIfEmpty(doSomethingElse().cast(String.class))
        .then()

这不是最整洁或最清晰的...but。它有点冗长,但我很想像这样映射到一个可选的:

代码语言:javascript
运行
复制
getMyThing().map(Optional::of).defaultIfEmpty(Optional.empty())
        .flatMap(thing -> thing.isPresent() ? doSomething() : doSomethingElse())
        .then()

如果需要经常这样做,可以考虑使用转换实用程序方法:

代码语言:javascript
运行
复制
public static <T> Mono<Optional<T>> optional(Mono<T> mono) {
    return mono.map(Optional::of).defaultIfEmpty(Optional.empty());
}

然后,...which将使您能够只执行默认操作,而不是每次都显式地执行映射/ getMyThing().transform(Utils::optional)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66878485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档