RxJava的操作符

RxJava中提供了大量不同种类,不同场景的Operators(操作符),RxJava的强大性就来自于它所定义的操作符。主要分类:

  • 创建操作:用于创建Observable的操作符;
  • 变换操:这些操作符可用于对Observable发射的数据进行变换;
  • 过滤操作:这些操作符用于从Observable发射的数据中进行选择;
  • 组合操作:组合操作符用于将多个Observable组合成一个单一的Observable;
  • 异常处理:这些操作符用于从错误通知中恢复;
  • 辅助操作:一组用于处理Observable的操作符;

其实我们创建Observable的create(),from(),just()等方法,都属于创建操作符那么,让我们通过代码,来看看各种操作符的实现。

1.创建操作

defer( ) — 只有当订阅者订阅才创建Observable;为每个订阅创建一个新的Observable

Observable.defer(new Func0<Observable<Object>>() {
    @Override
    public Observable<Object> call() {
        //创建并返回新的Observable,
        return null;
    }
});

repeat( ) — 创建一个重复发射指定数据或数据序列的Observable

Observable.just(1).repeat(3).subscribe(new Action1<Integer>() {
    @Override
    public void call(Integer integer) {
        Log.d("RxJava", String.valueOf(integer));
    }
});

结果:将数字1,重复发射3次

11-06 15:05:39.610 7636-7636/? D/RxJava: 1
11-06 15:05:39.611 7636-7636/? D/RxJava: 1
11-06 15:05:39.611 7636-7636/? D/RxJava: 1

range( ) — 创建一个发射指定范围的整数序列的Observable

Observable.range(1,4).subscribe(new Action1<Integer>() {
    @Override
    public void call(Integer integer) {
        Log.d("RxJava", String.valueOf(integer));
    }
});

结果:发射1-4的整数

11-06 15:12:02.076 19930-19930/keye.com.rxjavaobserver D/RxJava: 1
11-06 15:12:02.076 19930-19930/keye.com.rxjavaobserver D/RxJava: 2
11-06 15:12:02.076 19930-19930/keye.com.rxjavaobserver D/RxJava: 3
11-06 15:12:02.076 19930-19930/keye.com.rxjavaobserver D/RxJava: 4

 

interval( ) — 创建一个按照给定的时间间隔发射整数序列的Observable

Observable.interval(1, TimeUnit.SECONDS).subscribe(new Action1<Long>() {
    @Override
    public void call(Long i) {
        Log.d("RxJava", String.valueOf(i));
    }
});

结果:每个1秒,发射一个整数序列中的数

11-06 15:16:58.648 29492-29524/keye.com.rxjavaobserver D/RxJava: 1
11-06 15:16:59.684 29492-29524/keye.com.rxjavaobserver D/RxJava: 2
11-06 15:17:00.688 29492-29524/keye.com.rxjavaobserver D/RxJava: 3
11-06 15:17:01.683 29492-29524/keye.com.rxjavaobserver D/RxJava: 4
11-06 15:17:02.689 29492-29524/keye.com.rxjavaobserver D/RxJava: 5
11-06 15:17:03.688 29492-29524/keye.com.rxjavaobserver D/RxJava: 6
11-06 15:17:04.685 29492-29524/keye.com.rxjavaobserver D/RxJava: 7
11-06 15:17:05.683 29492-29524/keye.com.rxjavaobserver D/RxJava: 8
11-06 15:17:06.683 29492-29524/keye.com.rxjavaobserver D/RxJava: 9

timer( ) — 创建一个在给定的延时之后发射单个数据的Observable

Observable.timer(3, TimeUnit.SECONDS).subscribe(new Action1<Long>() {
    @Override
    public void call(Long i) {
        Log.d("RxJava", i);
    }
});

结果:3秒后,发射了一个包含数字0的Observable

11-06 15:22:57 /keye.com.rxjavaobserver D/RxJava: 0

empty( ) — 创建一个什么都不做直接通知完成的Observable

Observable.empty().subscribe(new Subscriber<Object>() {
    @Override
    public void onCompleted() {
        Log.d("RxJava", "发送了一个空的的Observable");
    }

    @Override
    public void onError(Throwable e) {

    }

    @Override
    public void onNext(Object o) {

    }
});

结果:发送了一个空的Observable,直接调用了onCompleted()方法

11-06 15:22:57 D/RxJava: 发送了一个空的的Observable

error( ) — 创建一个什么都不做直接通知错误的Observable

Observable.empty().subscribe(new Subscriber<Object>() {
    @Override
    public void onCompleted() {
       
    }

    @Override
    public void onError(Throwable e) {
       Log.d("RxJava", "发送了一个空的的Observable");
    }

    @Override
    public void onNext(Object o) {

    }
});

结果:发送了一个空的Observable,直接调用了onError()方法

11-06 15:22:57 D/RxJava: 发送了一个空的的Observable

 

2.变换操作

scan( ) — 对Observable发射的每一项数据应用一个函数,然后按顺序依次发射每一个值

Observable.just(1, 2, 3)
        .scan(new Func2<Integer, Integer, Integer>() {
            @Override
            public Integer call(Integer integer, Integer integer2) {
                //自定义函数
                return integer + integer2;
            }
        })
        .subscribe(new Action1<Integer>() {
            @Override
            public void call(Integer integer) {
                Log.d("RxJava", String.valueOf(integer));
            }
        });

结果:将自定义函数应用于数据序列,并将这个函数的结果作为函数下一次的参数1使用,1+0=1,1+2=3 ,3+3=6

11-06 02:54:43.040 25433-25433/keye.com.rxjavaobserver D/RxJava: 1
11-06 02:54:43.040 25433-25433/keye.com.rxjavaobserver D/RxJava: 3
11-06 02:54:43.040 25433-25433/keye.com.rxjavaobserver D/RxJava: 6

groupBy( ) — 将Observable分拆为Observable集合,将原始Observable发射的数据按Key分组,每一个Observable发射一组不同的数据

Observable.just(1, 2, 3, 4)
        .groupBy(new Func1<Integer, Integer>() {
            @Override
            public Integer call(Integer integer) {
                //这里返回的结果为key
                return integer + 1;
            }
        })
        .subscribe(new Action1<GroupedObservable<Integer, Integer>>() {
            @Override
            public void call(GroupedObservable<Integer, Integer> groupedObservable) {

                groupedObservable.subscribe(new Action1<Integer>() {
                    @Override
                    public void call(Integer integer) {
                        Log.d("RxJava", "key:" + groupedObservable.getKey() + ",value:" + integer);
                    }
                });
            }
        });

结果:在第一个func1函数中,设置key,最后生成一个Observable集合,并把每一个groupedObservable,并依次发射出去

 3162-3162/keye.com.rxjavaobserver D/RxJava: key:2,value:1
 3162-3162/keye.com.rxjavaobserver D/RxJava: key:3,value:2
 3162-3162/keye.com.rxjavaobserver D/RxJava: key:4,value:3
 3162-3162/keye.com.rxjavaobserver D/RxJava: key:5,value:4

buffer( ) — 它定期从Observable收集数据到一个集合,然后把这些数据集合打包发射,而不是一次发射一个

Observable.just(1, 2, 3, 4,5,6,7)
          .buffer(2, 1)
          .subscribe(new Action1<List<Integer>>() {
              @Override
              public void call(List<Integer> integers) {
                Log.d("RxJava", integers + "");
              }
});

结果:buffer()有两个参数count和skip,count指定List的大小,skip指定每次发射一个List需要跳过几个数;buffer(2, 1):每组2个数,每次跳过1个数,结果如下:

keye.com.rxjavaobserver D/RxJava: [1, 2]
keye.com.rxjavaobserver D/RxJava: [4, 5]
keye.com.rxjavaobserver D/RxJava: [7]

window( ) — 定期将来自Observable的数据分拆成一些Observable窗口,然后发射这些窗口,而不是每次发射一项

Observable.just(1, 2, 3, 4, 5, 6, 7)
          .window(2, 2)
          .subscribe(new Action1<Observable<Integer>>() {
              @Override
              public void call(Observable<Integer> observable) {
                  Log.d("RxJava", "window" );
                  observable.subscribe(new Action1<Integer>() {
                      @Override
                      public void call(Integer integer) {
                          Log.d("RxJava", integer + "");
                      }
                  });
              }
});

结果:window()操作符和buffer()类似,都是缓存一段数据集合,再打包发射出去

11-06 03:30:29.198 25883-25883/? D/RxJava: window
11-06 03:30:29.198 25883-25883/? D/RxJava: 1
11-06 03:30:29.198 25883-25883/? D/RxJava: 2
11-06 03:30:29.198 25883-25883/? D/RxJava: window
11-06 03:30:29.198 25883-25883/? D/RxJava: 3
11-06 03:30:29.198 25883-25883/? D/RxJava: 4
11-06 03:30:29.198 25883-25883/? D/RxJava: window
11-06 03:30:29.198 25883-25883/? D/RxJava: 5
11-06 03:30:29.199 25883-25883/? D/RxJava: 6
11-06 03:30:29.199 25883-25883/? D/RxJava: window
11-06 03:30:29.199 25883-25883/? D/RxJava: 7

3.过滤操作

filter( ) — 过滤数据

Observable.just(1, 2, 3, 4, 5, 6)
        .filter(new Func1<Integer, Boolean>() {
            @Override
            public Boolean call(Integer integer) {
                //从数组中,筛选偶数
                return integer % 2 == 0;
            }
        }).subscribe(new Action1<Integer>() {
            @Override
             public void call(Integer i) {
                Log.d("RxJava", String.valueOf(i));
        }
});

结果:

11-06 03:42:04.747 4213-4213/? D/RxJava: 2
11-06 03:42:04.747 4213-4213/? D/RxJava: 4
11-06 03:42:04.747 4213-4213/? D/RxJava: 6

takeLast( ) — 只发射最后的N项数据

Observable.just(1, 2, 3, 4, 5, 6)
        .takeLast(3//取最后3项数据
        .subscribe(new Action1<Integer>() {
            @Override
            public void call(Integer i) {
                Log.d("RxJava", String.valueOf(i));
            }
        });

结果:

11-06 03:44:18.307 6379-6379/keye.com.rxjavaobserver D/RxJava: 4
11-06 03:44:18.307 6379-6379/keye.com.rxjavaobserver D/RxJava: 5
11-06 03:44:18.307 6379-6379/keye.com.rxjavaobserver D/RxJava: 6

last( ) — 只发射最后的一项数据

Observable.just(1, 2, 3, 4, 5, 6)
        .last()
        .subscribe(new Action1<Integer>() {
            @Override
            public void call(Integer i) {
                Log.d("RxJava", String.valueOf(i));
            }
        });

结果:

11-06 03:49:46.710 6582-6582/? D/RxJava: 6

skip( ) — 跳过开始的N项数据

Observable.just(1, 2, 3, 4, 5, 6)
        .skip(3)
        .subscribe(new Action1<Integer>() {
            @Override
            public void call(Integer i) {
                Log.d("RxJava", String.valueOf(i));
            }
        });

结果:

11-06 03:49:46.710 6582-6582/? D/RxJava: 4
11-06 03:49:46.710 6582-6582/? D/RxJava: 5
11-06 03:49:46.710 6582-6582/? D/RxJava: 6

take( ) — 只发射开始的N项数据

Observable.just(1, 2, 3, 4, 5, 6)
        .take(3)
        .subscribe(i -> {
            Log.d("RxJava", String.valueOf(i));
        });

结果:

11-06 03:49:46.710 6582-6582/? D/RxJava: 1
11-06 03:49:46.710 6582-6582/? D/RxJava: 2
11-06 03:49:46.710 6582-6582/? D/RxJava: 3

first( ) and takeFirst( ) — 只发射第一项数据,或者满足某种条件的第一项数据

Observable.just(1, 2, 3, 4, 5, 6)
        .first()
        .subscribe(i -> {
            Log.d("RxJava", String.valueOf(i));
        });

结果:

11-06 03:49:46.710 6582-6582/? D/RxJava: 1

elementAt( ) — 发射第N项数据

Observable.just(1, 2, 3, 4, 5, 6)
        .elementAt(3)
        .subscribe(i -> {
            Log.d("RxJava", String.valueOf(i));
        });

结果:

11-06 03:49:46.710 6582-6582/? D/RxJava: 4

sample( ) or throttleLast( ) — 定期发射Observable最近的数据

Observable.interval(1,TimeUnit.SECONDS)
        .sample(4, TimeUnit.SECONDS)
        .subscribe(i -> {
            Log.d("RxJava", String.valueOf(i));
        });

结果:interval()每隔一秒发送整数序列,sample()每隔4秒,获取Observable的数据,结果如下:

-16618/keye.com.rxjavaobserver D/RxJava: 3
-16618/keye.com.rxjavaobserver D/RxJava: 6
-16618/keye.com.rxjavaobserver D/RxJava: 10
-16618/keye.com.rxjavaobserver D/RxJava: 14
-16618/keye.com.rxjavaobserver D/RxJava: 18
-16618/keye.com.rxjavaobserver D/RxJava: 22

debounce( ) — 只有当Observable在指定的时间后还没有发射数据时,才发射一个数据

Observable.create(new Observable.OnSubscribe<Integer>() {
    @Override
    public void call(Subscriber<? super Integer> subscriber) {
        try {
            for (int i = 1; i < 10; i++) {
                subscriber.onNext(i);
                Thread.sleep(i * 1000); //每次发送,延迟i*1秒
            }
            subscriber.onCompleted();
        } catch (Exception e) {
            subscriber.onError(e);
        }
    }
})
        .subscribeOn(Schedulers.newThread())
        .debounce(3000, TimeUnit.MILLISECONDS) //3秒没有数据,则发送
        .subscribe(new Action1<Integer>() {
            @Override
            public void call(Integer integer) {
                Log.d("RxJava", String.valueOf(integer));
            }
        });

结果:前3个数延迟短,没有触发debounce()操作符,第4个数延迟3秒,debounce()生效

30534-30550/keye.com.rxjavaobserver D/RxJava: 4
30534-30550/keye.com.rxjavaobserver D/RxJava: 5
30534-30550/keye.com.rxjavaobserver D/RxJava: 6
30534-30550/keye.com.rxjavaobserver D/RxJava: 7
30534-30550/keye.com.rxjavaobserver D/RxJava: 8

distinct( ) — 过滤掉重复数据

Observable.just(1, 2, 1, 4, 1, 6)
        .distinct()
        .subscribe(i -> {
            Log.d("RxJava", String.valueOf(i));
        });

结果:

11-06 04:38:49.987 19504-19504/keye.com.rxjavaobserver D/RxJava: 1
11-06 04:38:49.987 19504-19504/keye.com.rxjavaobserver D/RxJava: 2
11-06 04:38:49.987 19504-19504/keye.com.rxjavaobserver D/RxJava: 4
11-06 04:38:49.988 19504-19504/keye.com.rxjavaobserver D/RxJava: 6

ofType( ) — 只发射指定类型的数据

Observable.just(1, "2", 3, "4", 5, 6)
        .ofType(Integer.class)
        .subscribe(i -> {
            Log.d("RxJava", String.valueOf(i));
        });

结果

11-06 04:44:28.321 25785-25785/keye.com.rxjavaobserver D/RxJava: 1
11-06 04:44:28.321 25785-25785/keye.com.rxjavaobserver D/RxJava: 3
11-06 04:44:28.321 25785-25785/keye.com.rxjavaobserver D/RxJava: 5
11-06 04:44:28.321 25785-25785/keye.com.rxjavaobserver D/RxJava: 6
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值