我一直在寻找一个关于如何使用 Zip 运算符以及如何处理我创建的 Observable 以将它们传递给它的简单答案,我想知道我是否应该为每个 observable 调用 subscribe(),这些答案都不是很容易找到,我必须自己弄清楚,所以这里有一个在 2 个 Observables 上使用 Zip 运算符的简单示例:
@Test
public void zipOperator() throws Exception {
List<Integer> indexes = Arrays.asList(0, 1, 2, 3, 4);
List<String> letters = Arrays.asList("a", "b", "c", "d", "e");
Observable<Integer> indexesObservable = Observable.fromIterable(indexes);
Observable<String> lettersObservable = Observable.fromIterable(letters);
Observable.zip(indexesObservable, lettersObservable, mergeEmittedItems())
.subscribe(printMergedItems());
}
@NonNull
private BiFunction<Integer, String, String> mergeEmittedItems() {
return new BiFunction<Integer, String, String>() {
@Override
public String apply(Integer index, String letter) throws Exception {
return "[" + index + "] " + letter;
}
};
}
@NonNull
private Consumer<String> printMergedItems() {
return new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
System.out.println(s);
}
};
}
打印结果是:
[0] a
[1] b
[2] c
[3] d
[4] e
我脑海中的问题的最终答案如下
传递给 zip() 方法的 Observables 只需要创建,它们不需要有任何订阅者,只需创建它们就足够了......如果你希望任何 observable 在调度程序上运行,你可以为那个 Observable 指定这个......我还尝试了 Observables 上的 zip() 运算符,他们应该等待那里的结果,只有当两个结果都准备好时才会触发 zip() 的 Consumable(这是预期的行为)