java - RxJava : behaviour of combineLatest

标签 java rx-java2 reactive combinelatest

我有以下代码:

    final Observable<String> a = Observable.just("a1", "a2");   
    final Observable<String> b = Observable.just("b1");

    final Observable<String> c = Observable.combineLatest(a, b, (first, second) -> first + second);

    c.subscribe(res -> System.out.println(res));

预期输出是什么?我本以为

a1b1
a2b1

但实际输出是

a2b1

这有道理吗?生成预期序列的正确运算符是什么?

最佳答案

正如该运算符的名称所暗示的那样,它结合了每个源的最新值。如果源是同步的或非常快,这可能意味着一个或多个源将运行至完成,并且运算符(operator)将仅记住每个源的最后一个值。您必须通过某种方式交错源值,例如在项目之间使用具有充足时间的异步源,并避免多个源的项目紧密重叠。

可以通过多种方式生成预期序列,具体取决于您的初衷。例如,如果您想要所有交叉组合,请使用 flatMap:

a.flatMap(aValue -> b, (aValue, bValue) -> first + second)
.subscribe(System.out::println);

如果 b 重新创建的成本很高,则缓存它:

Observable<String> cachedB = b.cache();
a.flatMap(aValue -> cachedB, (aValue, bValue) -> first + second)
.subscribe(System.out::println);

关于java - RxJava : behaviour of combineLatest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48888864/

相关文章:

java - 禁用 JSP 扩展处理

swift - 如何使用先前可观察链的结果?

merge - RxSwift 中的合并和平面图运算符有什么区别

android - 在处理时停止 rxJava 可观察链执行

android - 使用 RxJava2 和 Retrofit2 Mosby MVI 的 OnErrorNotImplementedException

java - Observable#single() 和 Observable#toSingle() 之间的区别?

java - 在Java中根据时间戳获取HDFS文件

java - 如何将字符串 "AXA || BXB && CXC || BXB"替换为 "AXA OR BXB && CXC OR BXB"?

java - Android - fragment 中 TabLayout 的中间选项卡错误

java - 在 RxJava 中抛出订阅异常