RxJava2 操作符和线程控制

一、创建操作符

       在上一篇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发射的数据序列,

四、组合操作符

五、辅助操作符

六、错误处理操作符

七、布尔操作符

八、条件操作符

九、转换操作符

十、线程控制

你可能感兴趣的:(rxjava)