首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Mono.fromCallable和Mono.justOrEmpty的差异

Mono.fromCallable和Mono.justOrEmpty的差异
EN

Stack Overflow用户
提问于 2022-02-22 09:23:03
回答 3查看 1.7K关注 0票数 2

以下两次处决有什么不同?

代码语言:javascript
运行
复制
Mono.justOrEmpty(someFunction())
  .doOnNext(() -> doSomeTask()).subscribe();

Mono.fromCallable(() -> someFunction())
  .doOnNext(() -> doSomeTask()).subscribe();
EN

回答 3

Stack Overflow用户

发布于 2022-02-23 13:35:14

对于Mono.fromCallable,只有在订阅结果Callable时才延迟调用Mono

(如果Mono.fromCallable(this::someFunction)不接受任何参数,甚至可以将代码片段重写为someFunction )

使用Mono.justOrEmpty,运算符将立即捕获该值,以供将来的排放使用。因此,实际上,在构造时立即调用someFunction()方法。

请注意,这两个变体将正确处理someFunction()返回的null (与Mono.just(...)不同)。在这种情况下,生成的Mono将简单地完成(没有onNextonComplete信号)。

还请注意,如果该方法是阻塞和长时间运行的,那么在这两种情况下它都可能是反模式。请参阅https://projectreactor.io/docs/core/release/reference/#faq.wrap-blocking

票数 4
EN

Stack Overflow用户

发布于 2022-02-22 09:54:57

基本上,使用Mono.fromCallable() Callable将结果值作为Mono发布。只有当指定的项存在时,Mono.justOrEmpty()才会将其作为Mono发出。

在官方文档中,justOrEmptyfromCallable描述如下:

Mono.justOrEmpty()

创建一个新的Mono,如果非空的话,它将发出指定的项,否则只能发射onComplete。

Mono.fromCallable()

使用提供的可调用创建一个生成其值的Mono。如果可调用解析为null,则生成的Mono将完成空。

如果您需要更多关于Mono的详细信息,可以检查正式文件。

票数 2
EN

Stack Overflow用户

发布于 2022-03-04 17:52:11

使用Mono.fromCallable,在订阅时将调用someFunction

代码语言:javascript
运行
复制
private static Integer someFunction() {
  System.out.println("calling someFunction");
  return 1;
}

public static void main(String[] args) {
  Mono<Integer> mono = Mono.fromCallable(ReactorApp2::someFunction)
                           .doOnNext(System.out::println);

  System.out.println("Subscribing...");

  mono.subscribe();
  mono.subscribe();
}

/*
Subscribing...
calling someFunction
1
calling someFunction
1
*/

使用Mono.justOrEmptysomeFunction只会被调用一次。

代码语言:javascript
运行
复制
private static Integer someFunction() {
  System.out.println("calling someFunction");
  return 1;
}

public static void main(String[] args) {
  Mono<Integer> mono = Mono.justOrEmpty(someFunction())
                           .doOnNext(System.out::println);

  System.out.println("Subscribing...");

  mono.subscribe();
  mono.subscribe();
}

/*
calling someFunction
Subscribing...
1
1
*/
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71218721

复制
相关文章

相似问题

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