美文网首页
RxJava学习笔记 -- 转换Observables --

RxJava学习笔记 -- 转换Observables --

作者: L_Xian | 来源:发表于2016-11-03 13:13 被阅读48次

    注:本文摘自《RxJava Essentials》翻译中文版电子书

    *map家族

    Map

    map函数接收一个指定的Func对象然后将它应用到每一个由Observable发射的值上。例子:

    private void loadList(List<AppInfo> apps) {
        Observable.from(apps)
            .map(new Func1<AppInfo,AppInfo>(){
                @Override
                public Appinfo call(AppInfo appInfo){
                    String currentName = appInfo.getName();
                    String lowerCaseName = currentName.toLowerCase();
                    appInfo.setName(lowerCaseName);
                    return appInfo;
                }
            })
            .subscribe(...);
    }
    

    上面例子实现了能够显示同样的列表,但是又要所有的名字都小写。

    FlatMap

    如果有这样一个需求:我们有一个这样的Observable,它发射一个数据序列,这些数据本身也可以发射Observable,这时候可以使用FlatMap。

    当我们在处理可能有大量的Observables时,重要是记住任何一个Observables发生错误的情况,flatMap()将会触发它自己的onError()函数并放弃整个链。

    重要的一点提示是关于合并部分:它允许交叉。如下图



    这意味着flatMap()不能够保证在最终生成的Observable中源Observables确切的发射顺序。

    ConcatMap

    concatMap()函数解决了flatMap()的交叉问题,提供了一种能够把发射的值连续在一起的铺平函数,而不是合并它们。


    FlatMapIterable

    flatMapInterable()和flatMap()很像。仅有的本质不同是它将源数据两两结成对并生成Iterable,而不是原始数据项和生成的Observables。

    SwitchMap

    switchMap()和flatMap()很像,除了一点:每当源Observable发射一个新的数据项(Observable)时,它将取消订阅并停止监视之前那个数据项产生的Observable,并开始监视当前发射的这一个。

    Scan

    scan()函数可以看做是一个累积函数。scan()函数对原始Observable发射的每一项数据都应用一个函数,计算出函数的结果值,并将该值填充回可观测序列,等待和下一次发射的数据一起使用。
    一个累加器例子:

    Observable.just(1,2,3,4,5)
            .scan((sum,item) -> sum + item)
            .subscribe(...);
    

    输出结果是:1,3,6,10,15

    比较每个安装应用的名字从而创建一个名字长度递增的列表:

    private void loadList(List<AppInfo> apps) {
        Observable.from(apps)
                .scan((appInfo,appInfo2) -> {
                    if(appInfo.getName().length > appInfo2.getName().length()){
                        return appInfo;
                    } else {
                        return appInfo2;
                    }
                })
                .distinct()
                .subscribe(...);
    }
    

    GroupBy

    groupBy() 是分组元素,依然是那个例子,我们想按照最近更新日期来排序我们的App时该怎么办?

    Observable<GroupedObservable<String,AppInfo>> groupedItems = Observable.from(apps)
        .groupBy(new Func1<AppInfo,String>(){
            @Override
            public String call(AppInfo appInfo){
                SimpleDateFormat formatter = new SimpleDateFormat("MM/yyyy");
                return formatter.format(new Date(appInfo.getLastUpdateTime()));
            }
        });
    
    Observable.concat(groupedItems)
        .subscribe(...);
    

    GroupedObservable是一个特殊的Observable,它源自一个分组的key。在这个例子中,key就是String,代表的意思是Month/Year格式化的最近更新日期。最后,我们将创建一个新的Observable将所有的联系起来。

    Buffer

    buffer()函数将源Observable变换一个新的Observable,这个新的Observable每次发射一组列表值而不是一个一个发射。



    上图中展示了buffer()如何将count作为一个参数来指定有多少数据项被包在发射的列表中。实际上,buffer()函数有几种变体。其中有一个是允许你指定一个skip值:此后每skip项数据,然后又用count项数据填充缓冲区。如下图所示:



    buffer()带一个timespan的参数,会创建一个每隔timespan时间段就会发射一个列表的Observable。

    Window

    window()函数和buffer()很像,但是它发射的是Observable而不是列表。

    Cast

    它是map()操作符的特殊版本。它将源Observable中的每一项数据都转换为新的类型,把它变成了不同的Class。

    相关文章

      网友评论

          本文标题:RxJava学习笔记 -- 转换Observables --

          本文链接:https://www.haomeiwen.com/subject/xywbuttx.html