反应式zip即使与defer一起使用也不会懒惰



我有这段带有项目反应器框架的代码,但这也适用于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(的订阅副作用会运行,即使最后没有什么可压缩的。

相关内容

  • 没有找到相关文章

最新更新