java - Reactor:检测空信号以能够作用于空Mono

Project Reactor Mono 是否有运算符或一些好的方法来实现 doOnEmpty() 的行为?

我想对操作结果产生副作用(日志记录)。

这是我现在拥有的:

myMono
  .map(value -> new Wrapped(value))
  .defaultIfEmpty(new Wrapped(null))
  .doOnEach( ... )
  .flatMap(wrapped -> 
    wrapped.value == null ? 
      Mono.empty() : Mono.just(wrapped.value))

所以我正在包装实际值,或者在空的情况下创建空包装器。然后 wrapper 因副作用而被消耗。

相反,使用类似 doOnEmpty(Consumer> signalConsumer) 的方法会很好。为了让事情更复杂一点,我需要访问 Signal以便访问上下文(包含日志记录所需的数据)。

有这些answers但我认为它们不适用或提供对 Context 的访问。

所以现在我想到了这一点,也许正确的问题是:

“是否有一种方法可以确定 doOnEach(Consumer Signal) 中的 observable 是否解析为空?”

最佳答案

一些实现无副作用的“Empty Catch”的例子。

  • doOnSuccess - 以可为空的结果调用
Mono.empty()
    .doOnSuccess(result -> {
        if (result == null) {
            // This is an empty result
            Logger.info(this.getClass(), "result = {}", result);
        }
    })
    .subscribe();
  • switchIfEmpty + doOnError - 使用抛出和捕获已知异常跳过管道
Mono.empty()
    .switchIfEmpty(Mono.error(new Exception()))
    .doOnNext(o -> Logger.info(Object.class, "doOnNext"))
    .doOnError(Exception.class, error -> Logger.info(Exception.class, "doOnError"))
    .subscribe();

https://stackoverflow.com/questions/54880354/

相关文章:

python - Matplotlib png 输出在 reportlab 的 pdf 中出现 "b

css - 如何推迟非关键样式?

Android WebRTC 不适用于不同的网络 - 无视频

javascript - 如何防止在 Angular 4+ 中更改查询字符串时页面刷新/重新加载?

c# - Microsoft 依赖注入(inject)和逆变

google-chrome - 谷歌登录 "error": "popup_closed_by_use

android - 通过 XML 设置选中状态

ubuntu-16.04 - 设置了 CATALINA_PID 但指定的文件不存在

firefox - 如何在 Amazon Linux (EC2) 实例上安装 GTK3 和 Fire

scala - 使用 MemSQL 中的分区下推在 Spark 中启用并行化