当需要进行10-12个小型并行查询并结合结果时,就会遇到这种情况。但是,如果有一个zip方法,允许您组合多达9个可观测值,那么如何做更多我不明白的事情。我试过用zip方法
public static <T, R> Observable<R> zip(Iterable<? extends ObservableSource<? extends T>> sources, Function<? super Object[], ? extends R> zipper)
但却犯了个错误
java.lang.ClassCastException: java.util.ArrayList cannot be cast to io.reactivex.ObservableSource
尝试是这样的
List<Observable> list = new ArrayList<>();
list.add(orderRepository.getOne(54, "id"));
list.add(orderRepository.getTwo(54, "id"));
list.add(orderRepository.getThree(54, "id"));
list.add(orderRepository.getFour(54, "id"));
list.add(orderRepository.getFive());
list.add(orderRepository.getSix(54, "id"));
list.add(orderRepository.getSeven(54, "id"));
list.add(orderRepository.getEight());
list.add(orderRepository.getNine());
list.add(orderRepository.getTen(54, "id"));
list.add(orderRepository.getEleven(54, "id"));
Observable.fromIterable(list);
return Observable.zip(list,
new Function<Object[], OrderModel>() {
@Override
public OrderModel apply(Object[] objects) throws Exception {
Logger.trace("objects = ", objects);
return new OrderModel();
}
});请举例说明如何在Java或Kotlin中这样做。
发布于 2018-08-20 05:21:06
Observable one = Observable.zip(
orderRepository.getOne(54, "id"),
orderRepository.getTwo(54, "id"),
// Etc up to five (I think)
Function zipper
);
Observable two = Observable.zip(
one, orderRepository.getSix(54, "id"),
orderRepository.getSeven(54, "id"),
// Etc up to five,
Function zipper
);冲洗并重复,直到你把所有可观察到的物体拉链在一起。
发布于 2018-08-20 05:47:08
下面是一个如何使用Iterable的Observable#zip重载的示例。您将得到一个新的结果Object[],因为不支持新的T[]。
在本例中,您将看到T的可观察性列表,它将在Observable#zip中使用。拉链函数将每个对象转换为String,并返回T的列表,结果得到了Observable>。
另外,我建议你们确保,所给出的可观察到的列表不是空的。当向Observable#zip提供一个空的可观测数据列表时,它将立即完成,而不会发出任何信息(感谢@akarnokd)。或者您可以使用Observable#switchIfEmpty来提供回退值(例如空列表)。
@Test
void x() {
Observable<String> z1 = Observable.just("1");
Observable<String> z2 = Observable.just("2");
Observable<String> z3 = Observable.just("3");
List<Observable<String>> observables = Arrays.asList(z1, z2, z3);
Observable<List<String>> zip =
Observable.zip(
observables,
objects -> {
List<String> resultList =
Stream.of(objects).map(o -> (String) o).collect(Collectors.toList());
return resultList;
});
zip.test()
.assertNoErrors()
.assertComplete()
.assertValueCount(1)
.assertValueAt(
0,
r -> {
assertThat(r).contains("1", "2", "3");
return true;
});
}发布于 2020-04-05 09:55:45
Observable.zip(Observable1 , Observable2 ,... Observable9 ,
Function9<return_value_observable1 , return_value_observable2 , .... ,
return_value_observable9 , ZipModel { ->
}https://stackoverflow.com/questions/51922827
复制相似问题