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

急切地评估。switchifempty()有什么意义?

牛华皓
2023-03-14

即使我的流不是空的,回退流总是会被创建?这样做背后的意图是什么?这是极不地道的。

  public static void main(String[] args) {
    Mono<Integer> m = Mono.just(1);
    m.flatMap(a -> Mono.delay(Duration.ofMillis(5000)).flatMap(p -> Mono.empty()))
        .switchIfEmpty(getFallback())
        .doOnNext(a -> System.out.println(a))
        .block();
  }

  private static Mono<Integer> getFallback() {
    System.out.println("In Here");
    return Mono.just(5);
  }
In Here (printed immediately)
5 (after 5s)

共有1个答案

寿翰飞
2023-03-14

这里您需要理解的是组装时间和订阅时间之间的区别。

组装时间是通过构建运算符链来创建管道的时间。此时,您的发布服务器尚未订阅,您需要进行必要的思考。

订阅时间是指通过订阅触发执行并且数据开始流经管道的时间。这时,您需要从回调、lambdas、延迟执行等方面进行反应性思考。

public static void main(String[] args) {
    Mono<Integer> m = Mono.just(1);

    m.flatMap(a -> Mono.delay(Duration.ofMillis(5000)).flatMap(p -> Mono.empty()))
     .switchIfEmpty(getFallback())
     .doOnNext(a -> System.out.println(a))
     .block();
}

private static Mono<Integer> getFallback() {
    System.out.println("Assembly time, here we are just in the process of creating the mono but not triggering it. This is always called regardless of the emptiness of the parent Mono.");
    return Mono.fromCallable(() -> {
        System.out.println("Subscription time, this is the moment when the publisher got subscribed. It is got called only when the Mono was empty and fallback needed.");
        return 5;
    });
}

2,您可以使用Mono.defer并将内单声道的执行和组装延迟到订阅:

public static void main(String[] args) {
    Mono<Integer> m = Mono.just(1);
    m.flatMap(a -> Mono.delay(Duration.ofMillis(5000)).flatMap(p -> Mono.empty()))
     .switchIfEmpty(Mono.defer(() -> getFallback()))
     .doOnNext(a -> System.out.println(a))
     .block();
}

private static Mono<Integer> getFallback() {
    System.out.println("Since we are using Mono.defer in the above pipeline, this message gets logged at subscription time.");
    return Mono.just(5);
}

请注意,您最初的解决方案也非常好。您只需要知道返回Mono之前的代码是在汇编时执行的。

 类似资料:
  • 我理解经典例子的问题 但我无法说服自己以下是有效的还是无效的 我知道'foo(i)'和'i'的求值顺序是不确定的,但是'评估'到底是什么意思?也就是说bar的第二个参数总是42,或者'i'的当前值可以在foo改变它之前被传入吗?

  • 我正在寻找一种方法来检索替代单声道,以防原始单声道是空的。我找到的最接近的是,但我的问题是,我无法将lambda表达式传递给它,因此即使Mono具有非空值,也会调用它。这有点像vs。 以下是一个示例:

  • 我得到了无限的名单是懒惰的。我不明白的是,一些有结尾的列表是懒惰的,为什么eager方法在我的情况下不起作用。 我有这个例子 当我想获得前100个元素时,它很有效。但是当我想要更多的时候,比如说200,我就无法得到这200个元素了。

  • 问题内容: 假设您将以下命令存储在变量中: 之间有什么区别 ?如果最后一个版本较短,为什么最后一个版本几乎从未使用过(据我所知)却完全相同? 问题答案: 第三种形式与其他两种形式完全不同,但是要理解为什么,我们需要在解释命令时使用bash时要遵循的操作顺序,并查看在使用每种方法时应遵循哪些操作。 报价处理 拆分为命令 特殊运算符解析 扩展 分词 乱语 执行 使用 从#1开始执行上述所有步骤。从而:

  • 问题内容: 我最近读到了Python 3的一个好处是它很懒。那就更好了 而不是 我很好奇的是如何使用这种懒惰。如果生成映射对象,例如,如何访问生成的操作/列表中的特定元素。在我所见过的几乎所有文档中,他们都会做类似或的事情(据我所知),它放弃了惰性概念,因为它隐式将地图转换为列表。 我想我正在寻找的是能够以与我可以懒惰地懒惰地生成地图对象类似的方式使用地图对象的能力,并且可以在没有巨大计算量的情况

  • 问题内容: 对于我确定的人来说,这是一个简单的答案。有人可以解释为什么此表达式的值为真吗? 问题答案: 因为您使用的是==(相似性)运算符,而PHP将字符串强制为int。 要解决此问题,请使用===(等于)运算符,该运算符不仅会检查值是否相同,还会检查数据类型是否相同,因此“ 123”字符串和123 int不会被视为相等。