使用zip方法可以把多个类型不同的数据源Observable合并为一个类型的数据源Observable。
public static <T1, T2, R> Observable<R> zip(Observable<? extends T1> o1, Observable<? extends T2> o2, final Func2<? super T1, ? super T2, ? extends R> zipFunction)
举个例子:
我有一个Apple,我还有一个Pen,我想要组合一个ApplePen
private Observable<Apple> obApple = Observable.just(new Apple());
private Observable<Pen> obPen = Observable.just(new Pen());
@Test
public void zip(){
Observable.zip(obApple, obPen, new Func2<Apple, Pen, ApplePen>() {
@Override
public ApplePen call(Apple apple, Pen pen) {
return new ApplePen(apple,pen);
}
}).subscribe(new Action1<ApplePen>() {
@Override
public void call(ApplePen applePen) {
System.out.println("applePen = " + applePen);
}
});
}
输出:
applePen = rxjava.zip.ApplePen@880ec60
rxjava提供了zip方法的多个重载方法,最多支持九个类型不同的数据源Observable合并。
public static <T1, T2, T3, T4, T5, T6, T7, T8, T9, R> Observable<R> zip(Observable<? extends T1> o1, Observable<? extends T2> o2, Observable<? extends T3> o3, Observable<? extends T4> o4, Observable<? extends T5> o5, Observable<? extends T6> o6, Observable<? extends T7> o7, Observable<? extends T8> o8,
Observable<? extends T9> o9, Func9<? super T1, ? super T2, ? super T3, ? super T4, ? super T5, ? super T6, ? super T7, ? super T8, ? super T9, ? extends R> zipFunction)
如果觉得九个类型依然无法满足需求,rxjava贴心的提供了数组参数,不限类型个数,尽情合并:
public static <R> Observable<R> zip(Observable<?>[] ws, FuncN<? extends R> zipFunction)
测试:
private Observable<Apple> obApple = Observable.just(new Apple());
private Observable<Pen> obPen = Observable.just(new Pen());
@Test
public void zipArray(){
Observable.zip(new Observable[]{obApple,obPen}, new FuncN<String>() {
@Override
public String call(Object... args) {
return "args = " + Arrays.deepToString(args);
}
}).subscribe(new Action1<String>() {
@Override
public void call(String s) {
System.out.println(s);
}
});
}
输出:
args = [rxjava.zip.Apple@7a79be86, rxjava.zip.Pen@34ce8af7]
既然有数据类型的参数,理所当然也有迭代器类型的参数:
public static <R> Observable<R> zip(Iterable<? extends Observable<?>> ws, FuncN<? extends R> zipFunction)
测试:
private Observable<Apple> obApple = Observable.just(new Apple());
private Observable<Pen> obPen = Observable.just(new Pen());
@Test
public void zipIterator(){
Set<Observable<?>> set = new HashSet<>();
set.add(obApple);
set.add(obPen);
Observable.zip(set,new FuncN<String>(){
@Override
public String call(Object... args) {
return "args = " + Arrays.deepToString(args);
}
}).subscribe(new Action1<String>() {
@Override
public void call(String s) {
System.out.println(s);
}
});
}
输出:
args = [rxjava.zip.Pen@b684286, rxjava.zip.Apple@880ec60]
除此之外,使用Observable包裹Observable,也能实现合并多个类型:
public static <R> Observable<R> zip(Observable<? extends Observable<?>> ws, final FuncN<? extends R> zipFunction)
测试:
private Observable<Apple> obApple = Observable.just(new Apple());
private Observable<Pen> obPen = Observable.just(new Pen());
@Test
public void zipObservable(){
Observable.zip(Observable.just(obApple, obPen), new FuncN<String>() {
@Override
public String call(Object... args) {
return "args = " + Arrays.deepToString(args);
}
}).subscribe(s->{
System.out.println(s);
});
}
输出:
args = [rxjava.zip.Apple@61dc03ce, rxjava.zip.Pen@50f8360d]
效果和使用数据,或者迭代器一样。