首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Mono.defualtEmpty()与Mono.switchIfEmpty()

Mono.defualtEmpty()与Mono.switchIfEmpty()
EN

Stack Overflow用户
提问于 2022-10-09 07:30:31
回答 1查看 53关注 0票数 0

当上游流发出nullValue时,我们可以使用'Mono.defualtIfEmpty()‘或'Mono.switchIfEmpty()’替换空值。

switchIfEmpty()对上层流值的求值非常迫切。因此,我们使用Mono.defer()来进行惰性评估。

  1. 'Mono.defualtIfEmpty()‘也是热切的评价吗?比如switchIfEmpty()?
  2. 如何更改Mono.defualtIfEmpty()来执行惰性评估?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-09 10:03:54

对于defaultIfEmpty,您必须在程序集上提供回退值,因此它必然是迫切的。

由于switchIfEmpty使用Mono作为参数,因此可以同时使用它进行热切和懒惰的评估。除了缓存的Mono或Mono.just之外,大多数Mono对象/实现都是延迟评估的。

在任何情况下,无论您选择哪种运算符,都不会急切地评估上游Mono。

仅在订阅时才对上游单点进行评估。

示例1:验证在订阅之前不会对上游进行评估:

代码语言:javascript
代码运行次数:0
运行
复制
var upstream = Mono.fromCallable(() -> {
    System.out.println("UPSTREAM EVALUATION");
    return "upstream";
});

var defaultIfEmpty = upstream.defaultIfEmpty("default");

System.out.println("Nothing evaluated yet");
Thread.sleep(2000);
System.out.println("Still not evaluated");

defaultIfEmpty.block();

输出:

代码语言:javascript
代码运行次数:0
运行
复制
Nothing evaluated yet
Still not evaluated
UPSTREAM EVALUATION

示例2:检查switchIfEmpty是否仅在上游评估后触发

代码语言:javascript
代码运行次数:0
运行
复制
var upstream = Mono.fromRunnable(() -> System.out.println("UPSTREAM EVALUATION"));
var switchEmpty = upstream.switchIfEmpty(Mono.fromCallable(() -> {
        System.out.println("SWITCH EVALUATED");
        return "switch";
}));

System.out.println("Nothing evaluated yet");
Thread.sleep(2000);
System.out.println("Still not evaluated");

switchEmpty.block();

输出:

代码语言:javascript
代码运行次数:0
运行
复制
Nothing evaluated yet
Still not evaluated
UPSTREAM EVALUATION
SWITCH EVALUATED

如果上游发送值,则不计算示例3:SwitchIfEmpty:

代码语言:javascript
代码运行次数:0
运行
复制
var upstream = Mono.fromCallable(() -> {
    System.out.println("UPSTREAM EVALUATION");
    return "upstream";
});

var switchEmpty = upstream.switchIfEmpty(Mono.fromCallable(() -> {
    System.out.println("SWITCH EVALUATED");
    return "switch";
}));

System.out.println("Nothing evaluated yet");
Thread.sleep(2000);
System.out.println("Still not evaluated");

switchEmpty.block();

输出:

代码语言:javascript
代码运行次数:0
运行
复制
Nothing evaluated yet
Still not evaluated
UPSTREAM EVALUATION
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74002870

复制
相关文章

相似问题

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