我有以下代码:
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/