处理Empty Mono<T>的方法

栏目: ASP.NET · 发布时间: 7年前

内容简介:在如果让你改成reactor你也许会改成这样:上面的示例代码里的注释已经写了

Reactor 编程中有时候我们需要对empty Mono<T> 做一些特定业务逻辑。下面看一段非reactor编程的代码:

public void oldCheck(Token token) {
  if (token == null) {
    // business logic
    return;
  }
  if (token.isExpired) {
    // business logic
    return;
  }
  // business logic
  return;
}

如果让你改成reactor你也许会改成这样:

public Mono<Void> badCheck(Mono<Token> tokenMono) {
  return tokenMono
      .flatMap(token -> {
        if (token == null) {
          // CAUTION: You will never be in here
          // business logic
          return Mono.empty();
        }
        if (token.isExpired) {
          // business logic
          return Mono.empty();
        }
        // business logic
        return Mono.empty();
      });
}

上面的示例代码里的注释已经写了 if (token == null) {} 的这个条件是永远成立的,这是因为当 Mono<Token> 是empty时,它是不会触发 flatMap 的。诸如 flatMap 的绝大部分Operator都依赖于 PublisherMonoFlux 都是 Pubisher )推送数据(详情请看 javadoc ),如果 Publisher 本身无数据可推送,那么就不会触发Operator。换句话说 flatMap 内部是不可能得到null的。

那么怎么做才可以?你可以使用 Java 8的 Optional 来作为中间值:

public Mono<Void> goodCheck(Mono<Token> tokenMono) {
  return tokenMono
      // Transform Mono<Token> to Mono<Optional<Token>>.
      // If Mono<Token> is empty, flatMap will not be triggered,
      // then we will get a empty Mono<Optional<Token>>
      .flatMap(token -> Mono.just(Optional.of(token)))
      // If Mono<Optional<Token>> is empty, provide an empty Optional<Token>,
      // then we will get a non-empty Mono<Optional<Token>> anyway
      .defaultIfEmpty(Optional.empty())
      // Since Mono<Optional<Token>> is not empty, flatMap will always be triggered.
      .flatMap(tokenOptional -> {
        if (!tokenOptional.isPresent()) {
          // business logic
          return Mono.empty();
        }
        Token token = tokenOptional.get();
        if (token.isExpired) {
          // business logic
          return Mono.empty();
        }
        // business logic
        return Mono.empty();
      });
}

除了 defaultIfEmpty 之外,Reactor还提供了 switchIfEmptyrepeatWhenEmpty 来处理empty Mono / Flux


以上所述就是小编给大家介绍的《处理Empty Mono的方法》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

High-Performance Compilers for Parallel Computing

High-Performance Compilers for Parallel Computing

Michael Wolfe / Addison-Wesley / 1995-6-16 / USD 117.40

By the author of the classic 1989 monograph, Optimizing Supercompilers for Supercomputers, this book covers the knowledge and skills necessary to build a competitive, advanced compiler for parallel or......一起来看看 《High-Performance Compilers for Parallel Computing》 这本书的介绍吧!

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具