以下两次处决有什么不同?
Mono.justOrEmpty(someFunction())
.doOnNext(() -> doSomeTask()).subscribe();
Mono.fromCallable(() -> someFunction())
.doOnNext(() -> doSomeTask()).subscribe();
发布于 2022-02-23 13:35:14
对于Mono.fromCallable
,只有在订阅结果Callable
时才延迟调用Mono
。
(如果Mono.fromCallable(this::someFunction)
不接受任何参数,甚至可以将代码片段重写为someFunction
)
使用Mono.justOrEmpty
,运算符将立即捕获该值,以供将来的排放使用。因此,实际上,在构造时立即调用someFunction()
方法。
请注意,这两个变体将正确处理someFunction()
返回的null
(与Mono.just(...)
不同)。在这种情况下,生成的Mono
将简单地完成(没有onNext
的onComplete
信号)。
还请注意,如果该方法是阻塞和长时间运行的,那么在这两种情况下它都可能是反模式。请参阅https://projectreactor.io/docs/core/release/reference/#faq.wrap-blocking
发布于 2022-02-22 09:54:57
基本上,使用Mono.fromCallable()
Callable
将结果值作为Mono
发布。只有当指定的项存在时,Mono.justOrEmpty()
才会将其作为Mono
发出。
在官方文档中,justOrEmpty
和fromCallable
描述如下:
Mono.justOrEmpty()
创建一个新的Mono,如果非空的话,它将发出指定的项,否则只能发射onComplete。
Mono.fromCallable()
使用提供的可调用创建一个生成其值的Mono。如果可调用解析为null,则生成的Mono将完成空。
如果您需要更多关于Mono
的详细信息,可以检查正式文件。
发布于 2022-03-04 17:52:11
使用Mono.fromCallable
,在订阅时将调用someFunction
。
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.justOrEmpty
,someFunction
只会被调用一次。
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
*/
https://stackoverflow.com/questions/71218721
复制相似问题