一、创建操作符
在上一篇RxJava的使用中讲到create,just,fromArray创建操作符,在这里讲述interval 、range和repeat。
1.interval
创建一个按固定时间间隔发射整数序列的Observable,并且Observable会收到递增至,相当于定时器,如下:
Observable observable = Observable.interval(3, TimeUnit.SECONDS);
Observer stringObserver = new Observer() {
@Override
public void onSubscribe(Disposable d) {
Log.e("AAA", "onSubscribe: " + d);
}
@Override
public void onNext(Long s) {
Log.e("AAA", "onNext: " + s);
}
@Override
public void onError(Throwable e) {
Log.e("AAA", "onError: " + e);
}
@Override
public void onComplete() {
Log.e("AAA", "onComplete: ");
}
};
observable.subscribe(stringObserver);
上面代码每隔3秒就会发射一次事件并打印onNext中的Log。
2.range
创建发射指定范围的整数序列的Observable,可以用来代替for循环,第一个参数是起始值,依次递增,第二个参数是发射的次数。
Observable observable = Observable.range(2, 5);
Observer stringObserver = new Observer() {
@Override
public void onSubscribe(Disposable d) {
Log.e("AAA", "onSubscribe: " + d);
}
@Override
public void onNext(Integer s) {
Log.e("AAA", "onNext: " + s);
}
@Override
public void onError(Throwable e) {
Log.e("AAA", "onError: " + e);
}
@Override
public void onComplete() {
Log.e("AAA", "onComplete: ");
}
};
observable.subscribe(stringObserver);
3.repeat
创建一个N次重复发射特定数据的Observable:
Observable observable = Observable.range(-1, 2).repeat(3);
输出结果:重复打印3次-1和0
二、变换操作符
变换操作符的作用是对Observable发射的数据按照一定的规则做一些变换操作,然后变换后的数据发射出去。讲解map、flatMap、cast、concatMap、flatMapIterable、buffer和groupBy。
1.map
map操作符通过指定一个Function对象,将Observable转换为一个新的Observable对象并发射,观察者将收到新的Observable处理。假设我们要访问网络,Host地址时常变换,有时是测试服务器地址,有时是正式服务器地址,但是具体界面的URL地址是不变的,因此,可以用map操作符来进行转换字符操作,如下:
final String string = "Hello";
Observable observable = Observable.just("Wrold").map(new Function() {
@Override
public String apply(String s) throws Exception {
return string + s;
}
});
Observer stringObserver = new Observer() {
@Override
public void onSubscribe(Disposable d) {
Log.e("AAA", "onSubscribe: " + d);
}
@Override
public void onNext(String s) {
Log.e("AAA", "onNext: " + s);
}
@Override
public void onError(Throwable e) {
Log.e("AAA", "onError: " + e);
}
@Override
public void onComplete() {
Log.e("AAA", "onComplete: ");
}
};
observable.subscribe(stringObserver);
2.flatMap、cast
flatMap操作符将Observable发射的数据集合变换为Observable集合,然后将这些Observable发射的数据平坦化的放进一个单独的Observable。cast操作符的作用是强制将Observable发射的所有数据转化为指定类型。
final String string = "Hello";
List list = new ArrayList<>();
list.add("=1");
list.add("=2");
list.add("=3");
list.add("=4");
Observable observable = Observable.just(list).flatMap(new Function, ObservableSource>>() {
@Override
public ObservableSource> apply(List strings) throws Exception {
List stringList = new ArrayList<>();
for (int i = 0; i < strings.size(); i++){
stringList.add(string + strings.get(i));
}
return Observable.fromIterable(stringList);
}
}).cast(String.class);
Observer stringObserver = new Observer() {
@Override
public void onSubscribe(Disposable d) {
Log.e("AAA", "onSubscribe: " + d);
}
@Override
public void onNext(String s) {
Log.e("AAA", "onNext: " + s);
}
@Override
public void onError(Throwable e) {
Log.e("AAA", "onError: " + e);
}
@Override
public void onComplete() {
Log.e("AAA", "onComplete: ");
}
};
observable.subscribe(stringObserver);
用ArrayList存储要访问的界面URL,然后通过flatMap转换成Observable。cast操作符将Observable中的数据转换为String类型输出。另外flatMap的合并允许交叉,可能会交错的发送事件,最终的结果的顺序可能并不是原始Observable发送时的顺序。
3.concatMap
concatMap操作符功能和flatMap操作符一致;不过,它解决flatMap交叉问题,能够把发送的值连续在一起的函数,而不是合并它们。
4.flatMapIterable
flatMapIterable操作符可以将数据包装成Iterable,在Iterable中就可以对数据进行处理:
List list = new ArrayList<>();
list.add("=1");
list.add("=2");
list.add("=3");
list.add("=4");
Observable observable = Observable.just(list).flatMapIterable(new Function, Iterable>() {
@Override
public Iterable apply(List strings) throws Exception {
//对数据进行处理
return strings;
}
});
Observer stringObserver = new Observer() {
@Override
public void onSubscribe(Disposable d) {
Log.e("AAA", "onSubscribe: " + d);
}
@Override
public void onNext(String s) {
Log.e("AAA", "onNext: " + s);
}
@Override
public void onError(Throwable e) {
Log.e("AAA", "onError: " + e);
}
@Override
public void onComplete() {
Log.e("AAA", "onComplete: ");
}
};
observable.subscribe(stringObserver);
5.buffe
buffer操作符将原Observable变成一个新的Observable,这个新的Observable每次发射组列表值而不是一个一个发射。和buffer操作符类似的还有window操作符,window操作符发射的是Observable而不是数据列表。如 buffer(2)意思是缓存量为2:
List list = new ArrayList<>();
list.add("=1");
list.add("=2");
list.add("=3");
list.add("=4");
Observable observable = Observable.just(list,"1","2").buffer(2);
Observer> stringObserver = new Observer>() {
@Override
public void onSubscribe(Disposable d) {
Log.e("AAA", "onSubscribe: " + d);
}
@Override
public void onNext(List s) {
Log.e("AAA", "onNext: " + s);
}
@Override
public void onError(Throwable e) {
Log.e("AAA", "onError: " + e);
}
@Override
public void onComplete() {
Log.e("AAA", "onComplete: ");
}
};
observable.subscribe(stringObserver);
6.groupBy
groupBy操作符用于分组元素,将原Observable变成一个发射Observable的新Observable(分组后)。它们中每一个新的Observable都发射一组指定的数据。
Student s = new Student("韦一笑", 12);
Student s1 = new Student("张三丰", 28);
Student s2 = new Student("周芷若", 26);
Student s3 = new Student("宋远桥", 56);
Student s4 = new Student("张无忌", 12);
Student s5 = new Student("周启帆", 28);
Student s6 = new Student("刘健", 28);
Observable> observable = Observable.just(s, s1, s2, s3, s4, s5, s6)
.groupBy(new Function() {
@Override
public Integer apply(Student student) throws Exception {
return student.getAge();
}
});
Observer stringObserver = new Observer() {
@Override
public void onSubscribe(Disposable d) {
Log.e("AAA", "onSubscribe: " + d);
}
@Override
public void onNext(Student s) {
Log.e("AAA", "onNext: " + s.getName() + "----" + s.getAge());
}
@Override
public void onError(Throwable e) {
Log.e("AAA", "onError: " + e);
}
@Override
public void onComplete() {
Log.e("AAA", "onComplete: ");
}
};
Observable.concat(observable).subscribe(stringObserver);
使用groupBy对某一个 key值进行分组,相同的key值数据排在一起。这里的key值就是学生的age(年龄)。concat是组合操作符。
三、过滤操作符
过滤操作符作用于过滤和选择Observable发射的数据序列,
四、组合操作符
五、辅助操作符
六、错误处理操作符
七、布尔操作符
八、条件操作符
九、转换操作符
十、线程控制