我有这段带有项目反应器框架的代码,但这也适用于rxjava1,刚刚测试了它(猜测rxjava2(,我找不到zipWith()
运算符评估其参数可流动性的原因,即使事先过滤了事件并使用了defer()
。
import reactor.core.publisher.Flux;
public class TestLazy {
public static void main(String[] args) {
Flux.just(1, 2, 3)
.filter(s -> s > 4)
.zipWith(Flux.defer(() -> Flux.just(get1(), get2(), get3())), (a, b) -> a + b)
.subscribe(System.out::println);
Flux.just(1, 2, 3)
.filter(s -> s > 4)
.flatMap(a -> Flux.defer(() -> Flux.just(fromFlatMap())))
.subscribe(System.out::println);
}
private static int fromFlatMap() {
System.out.println("from flatMap");
return 0;
}
private static int get1() {
System.out.println("get 1");
return 1;
}
private static int get2() {
System.out.println("get 2");
return 2;
}
private static int get3() {
System.out.println("get 3");
return 3;
}
}
输出为
get 1
get 2
get 3
对于flatMap()
,情况并非如此。为什么会有这种行为?感谢
flatMap
从不执行其lambda,因为它从不接收任何值。
各种库的当前版本中的zipWith
总是订阅其两个源,因此这些get
(println
(的订阅副作用会运行,即使最后没有什么可压缩的。