RxJava学习篇之二:操作符的讲解(1)

15 篇文章 0 订阅

1,just

Just将单个数据转换为发射那个数据的Observable。

例:

 private void testJust(){
        Observable.just(1,2,3,4,5,6)
                .subscribe(new Action1<Integer>() {
                    @Override
                    public void call(Integer integer) {
                        System.out.println(integer);
                    }
                });
    }
输出:

1
2
3
4
5
6

2.from

Fom将其它种类的对象和数据类型转换为Observable

例:

   private void testFrom(){
        Integer[] nums = new Integer[]{1,2,3,4,5};
        Observable.from(nums)
                .subscribe(new Action1<Integer>() {
                    @Override
                    public void call(Integer integer) {
                        System.out.println(integer);
                    }
                });
    }
输出:

1
2
3
4
5
3,create
Create使用一个函数从头开始创建一个Observable

例:

 private void testCreate(){
        Observable.create(new Observable.OnSubscribe<Integer>() {
            @Override
            public void call(Subscriber<? super Integer> subscriber) {
                subscriber.onNext(1);
                subscriber.onNext(2);
                subscriber.onNext(3);
                subscriber.onNext(4);
                subscriber.onNext(5);
                subscriber.onCompleted();
            }
        }).subscribe(new Action1<Integer>() {
            @Override
            public void call(Integer integer) {
                System.out.println(integer);
            }
        });
    }
输出:

1
2
3
4
5
4,empty

Empty创建一个不发射任何数据但是正常终止的Observable

例:

private void testEmpty(){
        Observable.empty()
                .subscribe(new Action1<Object>() {
                    @Override
                    public void call(Object o) {
                        System.out.println("onNext");
                    }
                }, new Action1<Throwable>() {
                    @Override
                    public void call(Throwable throwable) {
                        System.out.println("onErr");
                    }
                }, new Action0() {
                    @Override
                    public void call() {
                        System.out.println("onComplete");
                    }
                });
    }
输出:

onComplete
5,never

Never创建一个不发射数据也不终止的Observable

例:

  private void testNever(){
        Observable.never()
                .subscribe(new Action1<Object>() {
                    @Override
                    public void call(Object o) {
                        System.out.println("onNext");
                    }
                }, new Action1<Throwable>() {
                    @Override
                    public void call(Throwable throwable) {
                        System.out.println("onErr");
                    }
                }, new Action0() {
                    @Override
                    public void call() {
                        System.out.println("onComplete");
                    }
                });
    }
输出:

ps:没有输出
6,error
Error创建一个不发射数据以一个错误终止的Observable

例:

 private void testError(){
        Observable.error(new Exception("错误了"))
                .subscribe(new Action1<Object>() {
                    @Override
                    public void call(Object o) {
                        System.out.println("onNext");
                    }
                }, new Action1<Throwable>() {
                    @Override
                    public void call(Throwable throwable) {
                        System.out.println("onErr:"+throwable.getMessage());
                    }
                }, new Action0() {
                    @Override
                    public void call() {
                        System.out.println("onComplete");
                    }
                });
    }
输出:
onErr:错误了
7,timer

Timer创建一个Observable,它在一个给定的延迟后发射一个特殊的值。

例:

 private void testTimer() {
        Observable.timer(500, TimeUnit.MILLISECONDS,Schedulers.computation())
                .subscribe(new Action1<Long>() {
                    @Override
                    public void call(Long aLong) {
                        Log.e("TAG","onNext:" + aLong);
                    }
                }, new Action1<Throwable>() {
                    @Override
                    public void call(Throwable throwable) {
                        Log.e("TAG","onErr:" + throwable.getMessage());
                    }
                }, new Action0() {
                    @Override
                    public void call() {
                        Log.e("TAG","onComplete" );
                    }
                });
    }
输出:

10-28 08:55:04.140 3536-3557/tbw.eage.rxjava E/TAG: onNext:0
10-28 08:55:04.140 3536-3557/tbw.eage.rxjava E/TAG: onComplete
ps:特殊值是0L,哈哈~
8,interval
Interval创建一个按固定时间间隔发射整数序列的Observable

例:

  private void testInterval() {
        Observable.interval(2, TimeUnit.SECONDS, Schedulers.computation())
                .subscribe(new Action1<Long>() {
                    @Override
                    public void call(Long aLong) {
                        Log.e("TAG", "onNext:" + aLong);
                    }
                }, new Action1<Throwable>() {
                    @Override
                    public void call(Throwable throwable) {
                        Log.e("TAG", "onErr:" + throwable.getMessage());
                    }
                }, new Action0() {
                    @Override
                    public void call() {
                        Log.e("TAG", "onComplete");
                    }
                });
    }
输出:
10-28 09:01:12.920 3886-3902/tbw.eage.rxjava E/TAG: onNext:0
10-28 09:01:14.919 3886-3902/tbw.eage.rxjava E/TAG: onNext:1
10-28 09:01:16.918 3886-3902/tbw.eage.rxjava E/TAG: onNext:2
10-28 09:01:18.918 3886-3902/tbw.eage.rxjava E/TAG: onNext:3
10-28 09:01:20.918 3886-3902/tbw.eage.rxjava E/TAG: onNext:4
10-28 09:01:22.919 3886-3902/tbw.eage.rxjava E/TAG: onNext:5
10-28 09:01:24.918 3886-3902/tbw.eage.rxjava E/TAG: onNext:6
ps:每个2秒输出一个自增的数据
9,range

Range创建一个发射特定整数序列的Observable

例:

 private void testRange(){
        Observable.range(5,5)
                .subscribe(new Action1<Integer>() {
                    @Override
                    public void call(Integer integer) {
                        Log.e("TAG", "onNext:" + integer);
                    }
                }, new Action1<Throwable>() {
                    @Override
                    public void call(Throwable throwable) {
                        Log.e("TAG", "onErr:" + throwable.getMessage());
                    }
                }, new Action0() {
                    @Override
                    public void call() {
                        Log.e("TAG", "onComplete");
                    }
                });
    }
输出:
10-28 09:04:38.010 4013-4013/? E/TAG: onNext:5
10-28 09:04:38.010 4013-4013/? E/TAG: onNext:6
10-28 09:04:38.010 4013-4013/? E/TAG: onNext:7
10-28 09:04:38.010 4013-4013/? E/TAG: onNext:8
10-28 09:04:38.010 4013-4013/? E/TAG: onNext:9
10-28 09:04:38.010 4013-4013/? E/TAG: onComplete
ps:是包括开头5的
创建操作符常用的差不多就这些了

1,flatMap

FlatMap  将一个发射数据的Observable变换为多个Observables,然后将它们发射的数据合并后放进一个单独的

Observable

例1:

 private void testFlatMap() {
        Observable.just("Hellon")
                .flatMap(new Func1<String, Observable<String>>() {
                    @Override
                    public Observable<String> call(final String str) {
                        final StringBuffer sb = new StringBuffer(str);
                        new Thread(new Runnable() {
                            @Override
                            public void run() {
                                try {
                                    Thread.sleep(1000);
                                } catch (InterruptedException e) {
                                    e.printStackTrace();
                                }
                                sb.append(" Rxjava");
                            }
                        }).start();
                        return Observable.just(sb.toString());
                    }
                })
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String str) {
                        Log.e("TAG", "onNext:" + str);
                    }
                }, new Action1<Throwable>() {
                    @Override
                    public void call(Throwable throwable) {
                        Log.e("TAG", "onErr:" + throwable.getMessage());
                    }
                }, new Action0() {
                    @Override
                    public void call() {
                        Log.e("TAG", "onComplete");
                    }
                });
    }
输出:

10-28 09:18:47.475 4505-4505/tbw.eage.rxjava E/TAG: onNext:Hellon
10-28 09:18:47.475 4505-4505/tbw.eage.rxjava E/TAG: onComplete

ps:注意它的输出,输出的是Hellon,并非Hellon RxJava.因为我在flapMap进行耗时的线程(Thread.sleep()),我们可以

类比实际应用中的网络请求的结果,耗时的结果我们是无法继续向下传递的,如果我们想输出Hellon Rxjava应该如何

做呢?请看例2.

例2:
private void testFlatMap() {
        Observable.just("Hellon")
                .flatMap(new Func1<String, Observable<String>>() {
                    @Override
                    public Observable<String> call(final String str) {
                        final PublishSubject<String> subject = PublishSubject.create();
                        final StringBuffer sb = new StringBuffer(str);
                        new Thread(new Runnable() {
                            @Override
                            public void run() {
                                try {
                                    Thread.sleep(1000);
                                } catch (InterruptedException e) {
                                    e.printStackTrace();
                                }
                                sb.append(" Rxjava");
                                subject.onNext(sb.toString());
                                subject.onCompleted();
                            }
                        }).start();
                        return subject;
                    }
                })
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String str) {
                        Log.e("TAG", "onNext:" + str);
                    }
                }, new Action1<Throwable>() {
                    @Override
                    public void call(Throwable throwable) {
                        Log.e("TAG", "onErr:" + throwable.getMessage());
                    }
                }, new Action0() {
                    @Override
                    public void call() {
                        Log.e("TAG", "onComplete");
                    }
                });
    }
输出:
10-28 09:19:41.393 4648-4665/tbw.eage.rxjava E/TAG: onNext:Hellon Rxjava
10-28 09:19:41.393 4648-4665/tbw.eage.rxjava E/TAG: onComplete
ps:这样我们就输入了Hellon Rxjava,这也是flapMap常用的一个场景。PublishSubject如果使用请看RxJava学习篇之一:基础Observable,Observer,Single,Subject,Scheduler

2,map

Map对Observable发射的每一项数据应用一个函数,执行变换操作

例:

 private void testMap(){
        Observable.just("hellon rxjava")
                .map(new Func1<String, String>() {
                    @Override
                    public String call(String s) {
                        return s.toUpperCase();
                    }
                })
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String str) {
                        Log.e("TAG", "onNext:" + str);
                    }
                }, new Action1<Throwable>() {
                    @Override
                    public void call(Throwable throwable) {
                        Log.e("TAG", "onErr:" + throwable.getMessage());
                    }
                }, new Action0() {
                    @Override
                    public void call() {
                        Log.e("TAG", "onComplete");
                    }
                });
    }
输出:

10-28 09:30:34.636 4872-4872/tbw.eage.rxjava E/TAG: onNext:HELLON RXJAVA
10-28 09:30:34.636 4872-4872/tbw.eage.rxjava E/TAG: onComplete
3,buffer

Buffer定期收集Observable的数据放进一个数据包裹,然后发射这些数据包裹,而不是一次发射一个值。
例1:

 private void testBuffer() {
        Observable.interval(1, TimeUnit.SECONDS, Schedulers.computation())
                .buffer(3)
                .subscribe(new Action1<List<Long>>() {
                    @Override
                    public void call(List<Long> longs) {
                        for (Long item : longs) {
                            Log.e("TAG", "onNext:" + item);
                        }
                        Log.e("TAG", "onNext------------------------------");
                    }
                });
    }
输出:
10-28 09:34:03.316 4997-5016/tbw.eage.rxjava E/TAG: onNext:0
10-28 09:34:03.316 4997-5016/tbw.eage.rxjava E/TAG: onNext:1
10-28 09:34:03.316 4997-5016/tbw.eage.rxjava E/TAG: onNext:2
10-28 09:34:03.316 4997-5016/tbw.eage.rxjava E/TAG: onNext------------------------------
10-28 09:34:06.316 4997-5016/tbw.eage.rxjava E/TAG: onNext:3
10-28 09:34:06.316 4997-5016/tbw.eage.rxjava E/TAG: onNext:4
10-28 09:34:06.316 4997-5016/tbw.eage.rxjava E/TAG: onNext:5
10-28 09:34:06.316 4997-5016/tbw.eage.rxjava E/TAG: onNext------------------------------
10-28 09:34:09.316 4997-5016/tbw.eage.rxjava E/TAG: onNext:6
10-28 09:34:09.316 4997-5016/tbw.eage.rxjava E/TAG: onNext:7
10-28 09:34:09.316 4997-5016/tbw.eage.rxjava E/TAG: onNext:8
10-28 09:34:09.316 4997-5016/tbw.eage.rxjava E/TAG: onNext------------------------------
10-28 09:34:12.316 4997-5016/tbw.eage.rxjava E/TAG: onNext:9
10-28 09:34:12.316 4997-5016/tbw.eage.rxjava E/TAG: onNext:10
10-28 09:34:12.316 4997-5016/tbw.eage.rxjava E/TAG: onNext:11
10-28 09:34:12.316 4997-5016/tbw.eage.rxjava E/TAG: onNext------------------------------
ps:每次收集3个值

例2:

 private void testBuffer() {
        Observable.interval(1, TimeUnit.SECONDS, Schedulers.computation())
               .publish(new Func1<Observable<Long>, Observable<List<Long>>>() {
                   @Override
                   public Observable<List<Long>> call(Observable<Long> longObservable) {
                       return longObservable.buffer(Observable.interval(2,TimeUnit.SECONDS));
                   }
               })
                .subscribe(new Action1<List<Long>>() {
                    @Override
                    public void call(List<Long> longs) {
                        for (Long item : longs) {
                            Log.e("TAG", "onNext:" + item);
                        }
                        Log.e("TAG", "onNext------------------------------");
                    }
                });
    }
输出:
10-28 09:46:39.384 5307-5328/tbw.eage.rxjava E/TAG: onNext:60
10-28 09:46:39.384 5307-5328/tbw.eage.rxjava E/TAG: onNext:61
10-28 09:46:39.384 5307-5328/tbw.eage.rxjava E/TAG: onNext------------------------------
10-28 09:46:41.383 5307-5328/tbw.eage.rxjava E/TAG: onNext:62
10-28 09:46:41.383 5307-5328/tbw.eage.rxjava E/TAG: onNext:63
10-28 09:46:41.383 5307-5328/tbw.eage.rxjava E/TAG: onNext------------------------------
10-28 09:46:43.383 5307-5328/tbw.eage.rxjava E/TAG: onNext:64
10-28 09:46:43.383 5307-5328/tbw.eage.rxjava E/TAG: onNext:65
10-28 09:46:43.383 5307-5328/tbw.eage.rxjava E/TAG: onNext------------------------------
10-28 09:46:45.383 5307-5328/tbw.eage.rxjava E/TAG: onNext:66
10-28 09:46:45.383 5307-5328/tbw.eage.rxjava E/TAG: onNext:67
10-28 09:46:45.383 5307-5328/tbw.eage.rxjava E/TAG: onNext------------------------------
10-28 09:46:47.383 5307-5328/tbw.eage.rxjava E/TAG: onNext:68
10-28 09:46:47.383 5307-5328/tbw.eage.rxjava E/TAG: onNext------------------------------
ps:每隔2秒收集一下数据(publish操作符后面会讲到)
4,groupBy

GroupBy将一个Observable分拆为一些Observables集合,它们中的每一个发射原始Observable的一个子序列

例:

  private void testGroupBy() {
        Observable.just(0, 1, 2, 3, 4, 5)
                .groupBy(new Func1<Integer, Boolean>() {
                    @Override
                    public Boolean call(Integer integer) {
                        return integer*1.0 % 2 == 0;
                    }
                })
                .flatMap(new Func1<GroupedObservable<Boolean, Integer>, Observable<Integer>>() {
                    @Override
                    public Observable<Integer> call(GroupedObservable<Boolean, Integer> groupedObservable) {

                        return groupedObservable.getKey() ? groupedObservable.take(0) : groupedObservable;
                    }
                })
                .subscribe(new Action1<Integer>() {
                    @Override
                    public void call(Integer i) {
                        Log.e("TAG", "onNext:" + i);
                    }
                });
    }
输出:
10-28 10:12:28.778 5533-5533/tbw.eage.rxjava E/TAG: onNext:1
10-28 10:12:28.778 5533-5533/tbw.eage.rxjava E/TAG: onNext:3
10-28 10:12:28.778 5533-5533/tbw.eage.rxjava E/TAG: onNext:5
5,scan
Scan连续地对数据序列的每一项应用一个函数,然后连续发射结果

例:

private void testScan(){
        Observable.just(1, 2, 3, 4, 5)
                .scan(new Func2<Integer, Integer, Integer>() {
                    @Override
                    public Integer call(Integer sum, Integer item) {
                        return sum + item;
                    }
                }).subscribe(new Subscriber<Integer>() {
            @Override
            public void onNext(Integer item) {
                Log.e("TAG", "onNext:" + item);
            }
            @Override
            public void onError(Throwable error) {
                Log.e("TAG", "onErr:" + error.getMessage());
            }
            @Override
            public void onCompleted() {
                Log.e("TAG","Sequence complete.");
            }
        });
    }
输出:

10-28 10:15:56.538 6201-6201/tbw.eage.rxjava E/TAG: onNext:1
10-28 10:15:56.539 6201-6201/tbw.eage.rxjava E/TAG: onNext:3
10-28 10:15:56.539 6201-6201/tbw.eage.rxjava E/TAG: onNext:6
10-28 10:15:56.539 6201-6201/tbw.eage.rxjava E/TAG: onNext:10
10-28 10:15:56.539 6201-6201/tbw.eage.rxjava E/TAG: onNext:15
10-28 10:15:56.539 6201-6201/tbw.eage.rxjava E/TAG: Sequence complete.
6,window
Window定期将来自原始Observable的数据分解为一个Observable窗口,发射这些窗口,而不是每次发射一项数据
 private void testWindow() {
        Observable.just(1, 2, 3, 4, 5)
                .window(2)
                .take(1)
                .flatMap(new Func1<Observable<Integer>, Observable<Integer>>() {
                    @Override
                    public Observable<Integer> call(Observable<Integer> integerObservable) {
                        return integerObservable;
                    }
                })
                .subscribe(new Subscriber<Integer>() {
                    @Override
                    public void onNext(Integer item) {
                        Log.e("TAG", "onNext:" + item);
                    }

                    @Override
                    public void onError(Throwable error) {
                        Log.e("TAG", "onErr:" + error.getMessage());
                    }

                    @Override
                    public void onCompleted() {
                        Log.e("TAG", "Sequence complete.");
                    }
                });
    }
输出:

10-28 10:25:08.186 6415-6415/tbw.eage.rxjava E/TAG: onNext:1
10-28 10:25:08.186 6415-6415/tbw.eage.rxjava E/TAG: onNext:2
10-28 10:25:08.186 6415-6415/tbw.eage.rxjava E/TAG: Sequence complete.
ps:可能还是看不懂window的用法。window和buffer类似都是缓存数据,不同的是buffer发射来自原始Observable

的数据包,而window发射的是Observables。buffer把缓存的数据封装成一个数据包(List),而window把缓存的数据

封装成一个observable。
变换操作符常用的差不多就这些了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值