栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

单声道switchIfEmpty()总是被调用

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

单声道switchIfEmpty()总是被调用

这是因为switchIfEmpty接受Mono“按值”。这意味着,即使在您订阅单声道之前,此替代单声道的评估也已触发。

想象这样的方法:

Mono<String> asyncAlternative() {    return Mono.fromFuture(CompletableFuture.supplyAsync(() -> {        System.out.println("Hi there");        return "Alternative";    }));}

如果您这样定义代码:

Mono<String> result = Mono.just("Some payload").switchIfEmpty(asyncAlternative());

无论在流构建期间发生什么,它总是会触发替代方法。为了解决这个问题,您可以通过使用推迟第二个单声道的评估

Mono.defer

Mono<String> result = Mono.just("Some payload")        .switchIfEmpty(Mono.defer(() -> asyncAlternative()));

这样,仅当请求替代项时才打印“ Hi there”

UPD:

详细说明我的答案。您面临的问题与Reactor无关,而与Java语言本身以及它如何解析方法参数有关。让我们检查一下我提供的第一个示例中的代码。

Mono<String> result = Mono.just("Some payload").switchIfEmpty(asyncAlternative());

我们可以将其重写为:

Mono<String> firstMono = Mono.just("Some payload");Mono<String> alternativeMono = asyncAlternative();Mono<String> result = firstMono.switchIfEmpty(alternativeMono);

这两个代码段在语义上是等效的。我们可以继续展开它们,以查看问题所在:

Mono<String> firstMono = Mono.just("Some payload");CompletableFuture<String> alternativePromise = CompletableFuture.supplyAsync(() -> {        System.out.println("Hi there");        return "Alternative";    }); // future computation already tiggeredMono<String> alternativeMono = Mono.fromFuture(alternativePromise);Mono<String> result = firstMono.switchIfEmpty(alternativeMono);

如您所见,当我们开始编写

Mono
类型时,将来的计算已经触发。为了防止不必要的计算,我们可以将我们的未来纳入延迟评估中:

Mono<String> result = Mono.just("Some payload")        .switchIfEmpty(Mono.defer(() -> asyncAlternative()));

哪个会解开

Mono<String> firstMono = Mono.just("Some payload");Mono<String> alternativeMono = Mono.defer(() -> Mono.fromFuture(CompletableFuture.supplyAsync(() -> {        System.out.println("Hi there");        return "Alternative";    }))); // future computation deferedMono<String> result = firstMono.switchIfEmpty(alternativeMono);

在第二个示例中,未来被困在一个懒惰的供应商中,并且仅在需要时才安排执行。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/615546.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号