zipWith方法作用是将Observable持有的类型与其他类型的数据进行合并,得到新的Observable和新类型。
RxJava提供了两种方式实现zipWith:
1、合并其他Observable
public final <T2, R> Observable<R> zipWith(Observable<? extends T2> other, Func2<? super T, ? super T2, ? extends R> zipFunction)
测试:
@Test
public void zipWithObservable(){
Observable.just(1).zipWith(Observable.just(1.0), new Func2<Integer, Double, String>() {
@Override
public String call(Integer integer, Double aDouble) {
return "integer = " + integer + ", aDouble = " + aDouble;
}
}).subscribe(s->{
System.out.println(s);
});
}
输出:
integer = 1, aDouble = 1.0
2、合并迭代器
public final <T2, R> Observable<R> zipWith(Iterable<? extends T2> other, Func2<? super T, ? super T2, ? extends R> zipFunction)
涉及迭代器,就要考虑迭代器的size。当size与Observable的发射的数据量不相等时,RxJava会选择较小的那个。
测试:
当just的数量和list数量相等时:
@Test
public void zipWithIterator(){
List<Double> list = new ArrayList<>();
list.add(1.0);
Observable.just(1).zipWith(list, new Func2<Integer, Double, String>() {
@Override
public String call(Integer integer, Double aDouble) {
return "integer = " + integer + ", aDouble = " + aDouble;
}
}).subscribe(s->{
System.out.println(s);
});
}
输出:
integer = 1, aDouble = 1.0
当just的数量 大于 list数量时:
List<Double> list = new ArrayList<>();
list.add(1.0);
list.add(2.0);
list.add(3.0);
Observable.just(1,2,3,4).zipWith(list, new Func2<Integer, Double, String>() {
@Override
public String call(Integer integer, Double aDouble) {
return "integer = " + integer + ", aDouble = " + aDouble;
}
}).subscribe(s->{
System.out.println(s);
});
输出:
integer = 1, aDouble = 1.0
integer = 2, aDouble = 2.0
integer = 3, aDouble = 3.0
当just的数量 小于 list数量时:
@Test
public void zipWithIterator2(){
List<Double> list = new ArrayList<>();
list.add(1.0);
list.add(2.0);
list.add(3.0);
Observable.just(1,2).zipWith(list, new Func2<Integer, Double, String>() {
@Override
public String call(Integer integer, Double aDouble) {
return "integer = " + integer + ", aDouble = " + aDouble;
}
}).subscribe(s->{
System.out.println(s);
});
}
输出:
integer = 1, aDouble = 1.0
integer = 2, aDouble = 2.0