Rx java 反应式zipWith,即使与延迟一起使用也不懒惰

Rx java 反应式zipWith,即使与延迟一起使用也不懒惰,rx-java,rx-java2,project-reactor,Rx Java,Rx Java2,Project Reactor,我在ProjectReactor框架中有这段代码,但这也适用于rxjava1,只是对它进行了测试(对rxjava2也进行了猜测),我找不到为什么zipWith()操作符会评估其参数flowable,即使事先过滤了事件并且使用了defer() 导入reactor.core.publisher.Flux; 公共类测试{ 公共静态void main(字符串[]args){ 通量。只是(1,2,3) .过滤器(s->s>4) .zipWith(Flux.defer(()->Flux.just(get1(

我在ProjectReactor框架中有这段代码,但这也适用于rxjava1,只是对它进行了测试(对rxjava2也进行了猜测),我找不到为什么
zipWith()
操作符会评估其参数flowable,即使事先过滤了事件并且使用了
defer()

导入reactor.core.publisher.Flux;
公共类测试{
公共静态void main(字符串[]args){
通量。只是(1,2,3)
.过滤器(s->s>4)
.zipWith(Flux.defer(()->Flux.just(get1(),get2(),get3()),(a,b)->a+b)
.subscribe(System.out::println);
通量。只是(1,2,3)
.过滤器(s->s>4)
.flatMap(a->Flux.defer(()->Flux.just(fromFlatMap()))
.subscribe(System.out::println);
}
私有静态int fromFlatMap(){
System.out.println(“来自平面地图”);
返回0;
}
私有静态int get1(){
System.out.println(“获取1”);
返回1;
}
私有静态int get2(){
System.out.println(“获取2”);
返回2;
}
私有静态int get3(){
System.out.println(“获取3”);
返回3;
}
}
输出是

get 1
get 2
get 3
对于
flatMap()
,情况并非如此。为什么会有这种行为?
感谢

flatMap
从未执行其lambda,因为它从未收到任何值


zipWith
在当前版本的各种库中,总是订阅它的两个源,因此
get
s(
println
)的订阅副作用得到运行,即使在最后,没有可压缩的内容。

flatMap
从不执行其lambda,因为它从不接收任何值


zipWith
在当前版本的各种库中,总是订阅它的两个源,因此那些
get
s(
println
)的订阅副作用开始运行,即使最后没有什么可压缩的。

谢谢David!感谢您在这些项目中所做的所有工作,并且仍然有时间回答社区问题。实际上,我的假设是不正确的,对于rxjava2/3,它的行为与rxjava1/reactor不同。推迟确实会有所不同汉克斯大卫!感谢您在这些项目中所做的所有工作,并且仍然有时间回答社区问题。实际上,我的假设是不正确的,对于rxjava2/3,它的行为与rxjava1/reactor不同。推迟确实会有所不同