Android开发学习之路--RxAndroid之操作符

  学习了RxAndroid的一些基本知识,上篇文章也试过了RxAndroid的map操作符,接着来学习更多的操作符的功能吧。
  操作符就是为了解决对Observable对象的变换的问题,操作符用于在Observable和最终的Subscriber之间修改Observable发出的事件。


map

  map从字面上理解就是映射的关系了,可以把一个事件转换为另一个事件,先看个例子吧还是:

 private void testMap1() {
        Observable.just("testMap")
        .map(s -> s + " by eastmoon")
        .subscribe(s -> Log.d(TAG, s));
    }

  这是个字符串拼接例子,主要是当observable发送了testMap后,经过map转换为testMap by east moon然后给了subscribe。

  接着我们继续看一个例子:

private void testMap2() {
        Observable.just("testMap")
                .map(s -> s.hashCode())
                .map(i -> Integer.toString(i))
                .subscribe(s -> Log.d(TAG, s));
    }

  这里主要是实现了类型转换,把String转换为int型,然后再把int型转换为String。这里的map可以无限的多,为了简化observable和subscribe的事情。

from

  Observable.from()方法,它接收一个集合作为输入,然后每次输出一个元素给subscriber。当有多个输入,那么就类似队列,一个一个来的时候,需要通过循环输出,而from刚好可以实现这个功能。先看下例子:

private void testFrom() {
        Observable.from(new String[]{"hello1", "hello2", "hello3"})
                .subscribe(s -> Log.d(TAG, s));
    }

  这里会依次输出hello1,hello2和hello3。

flatMap

  Observable.flatMap()接收一个Observable的输出作为输入,同时输出另外一个Observable。

private void testFlatMap() {
        List<String> list = new ArrayList<String>();
        list.add("hello1");
        list.add("hello2");
        list.add("hello3");
        Observable.just(list)
                .flatMap(s -> Observable.from(s))
                .subscribe(s1 -> Log.d(TAG, s1));
    }

  这里定义了一个list,传入之后返回的是Observable的from方法,然后通过flatMap把返回的from方法作为输入,再通过subscribe方法。

filter

  filter()输出和输入相同的元素,并且会过滤掉那些不满足检查条件的。

     private void testFlatMap() {
        List<String> list = new ArrayList<String>();
        list.add("hello1");
        list.add("hello2");
        list.add("hello3");
        list.add("haha1");
        list.add("haha2");
        Observable.just(list)
                .flatMap(s -> Observable.from(s))
                .filter(s -> filterString(s, "hello"))
                .subscribe(s2 -> Log.d(TAG, s2));
    }

    private boolean filterString(String str, String str1) {
        String subs = str.substring(0, str1.length());
        if(!subs.equals(str1))
            return true;
        return false;
    }

   这里选取了hello开头的String过滤掉,不是hello开头的不过滤。

take

   take()输出最多指定数量的结果。

private void testFlatMap() {
        List<String> list = new ArrayList<String>();
        list.add("hello1");
        list.add("hello2");
        list.add("hello3");
        list.add("haha1");
        list.add("haha2");
        list.add("haha3");
        list.add("haha4");
        Observable.just(list)
                .flatMap(s -> Observable.from(s))
                .filter(s -> filterString(s, "hello"))
                .take(3)
                .subscribe(s2 -> Log.d(TAG, s2));
    }

    private boolean filterString(String str, String str1) {
        String subs = str.substring(0, str1.length());
        if(!subs.equals(str1))
            return true;
        return false;
    }

   这里take(3),表示最多输出3个,虽然上面有四个符合。

doOnNext

   doOnNext()允许我们在每次输出一个元素之前做一些额外的事情。

private void testFlatMap() {
        List<String> list = new ArrayList<String>();
        list.add("hello1");
        list.add("hello2");
        list.add("hello3");
        list.add("haha1");
        list.add("haha2");
        list.add("haha3");
        list.add("haha4");
        Observable.just(list)
                .flatMap(s -> Observable.from(s))
                .filter(s -> filterString(s, "hello"))
                .take(3)
                .doOnNext(s1 -> Log.d(TAG, "doOnNext:"+s1))
                .subscribe(s2 -> Log.d(TAG, "subscribe:"+s2));
    }

    private boolean filterString(String str, String str1) {
        String subs = str.substring(0, str1.length());
        if(!subs.equals(str1))
            return true;
        return false;
    }

  这里只是通过简单的打印来查看信息。
  基本上操作符就先学习这些了,当然还有更多的操作符,可以参考文档。更多文档

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值