RxJava操作符-组合


startWith

public final Observable<T> startWith(Observable<T> values)
public final Observable<T> startWith(java.lang.Iterable<T> values)
public final Observable<T> startWith(T t1)
......
public final Observable<T> startWith(T t1, T t2, T t3,  T t4,  T t5,  T t6,  T t7,  T t8,  T t9)

接受一个Observable、Iterable实例或者1到9个值作为参数。在释放原始的Observable释放的序列前先释放传入的Observable实例释放的序列、Iterable实例的元素或者按传入顺序释放传入的1到9个值。

merge,mergeWith

public static <T> Observable<T> merge(java.lang.Iterable<? extends Observable<? extends T>> sequences)
public static <T> Observable<T> merge(java.lang.Iterable<? extends Observable<? extends T>> sequences,  int maxConcurrent)
public static <T> Observable<T> merge(Observable<? extends T>[] sequences)
public static <T> Observable<T> merge(Observable<? extends T>[] sequences,  int maxConcurrent)
public static <T> Observable<T> merge(Observable<? extends T> t1, Observable<? extends T> t2)
public static <T> Observable<T> merge(Observable<? extends Observable<? extends T>> source)
public static <T> Observable<T> merge(Observable<? extends Observable<? extends T>> source, int maxConcurrent)
......
public static <T> Observable<T> merge(Observable<? extends T> t1,
                      Observable<? extends T> t2,
                      Observable<? extends T> t3,
                      Observable<? extends T> t4,
                      Observable<? extends T> t5,
                      Observable<? extends T> t6,
                      Observable<? extends T> t7,
                      Observable<? extends T> t8,
                      Observable<? extends T> t9)

简单来说就是把一大堆的Observable释放的序列合并到一个Observerble来释放。所以可以看到,ta接受的参数可以是2到9个的Observable实例、泛型为Observable的Iterable实例、类型为Observable的数组或者释放的序列类型为Observable的Observable实例。注意,ta还可以接受一个int类型的参数,用来限制每次订阅合并的Observable的最大个数,当要合并的Observable数大于这个值,多出来的Observable暂时不会合并,直到已经合并的Observable中有终止了的(发出onComplted通知),再继续合并未合并的Observable。注意,当这些要合并的Observable中有发onError通知终止的,那么最终合并得来的那个Observable也将立即发出onError通知终止。还有一个小点就是Observable实例有个方法mergeWith用来将这个Observable实例和其taObservable实例合并。

mergeDelayError

public static <T> Observable<T> mergeDelayError(Observable<? extends Observable<? extends T>> source)
public static <T> Observable<T> mergeDelayError(Observable<? extends T> t1, Observable<? extends T> t2)
......
public static <T> Observable<T> mergeDelayError(Observable<? extends T> t1,
                                Observable<? extends T> t2,
                                Observable<? extends T> t3,
                                Observable<? extends T> t4,
                                Observable<? extends T> t5,
                                Observable<? extends T> t6,
                                Observable<? extends T> t7,
                                Observable<? extends T> t8,
                                Observable<? extends T> t9)

基本和上面merge一样,不过对于错误处理上稍强一些。当被合并的一堆Observable中有发出onError终止的,最终那个合并得来的Observable不会立即终止,而是继续释放其ta没有终止的被合并的Observable发出的序列,最后才发出onError终止。因为可能不止一个被合并的Observable会发出onError,因此会有可能会有多种错误类型,最终在订阅的Observer的onError方法中会收到CompositeException类型的异常。注意,最终合并得来的Observable最多只会调用一次onError方法。

zip,zipWith

public static <R> Observable<R> zip(java.lang.Iterable<? extends Observable<?>> ws,  FuncN<? extends R> zipFunction)
public static <R> Observable<R> zip(Observable<? extends Observable<?>> ws, FuncN<? extends R> zipFunction)
public static <T1,T2,R> Observable<R> zip(Observable<? extends T1> o1, Observable<? extends T2> o2, Func2<? super T1,? super T2,? extends R> zipFunction)
......
public static <T1,T2,T3,T4,T5,T6,T7,T8,T9,R> Observable<R> zip(Observable<? extends T1> o1,
                                               Observable<? extends T2> o2,
                                               Observable<? extends T3> o3,
                                               Observable<? extends T4> o4,
                                               Observable<? extends T5> o5,
                                               Observable<? extends T6> o6,
                                               Observable<? extends T7> o7,
                                               Observable<? extends T8> o8,
                                               Observable<? extends T9> o9,
                                               Func9<? super T1,? super T2,? super T3,? super T4,? super T5,? super T6,? super T7,? super T8,? super T9,? extends R> zipFunction)

#Observable实例的方法(zipWith):
public final <T2,R> Observable<R> zipWith(Observable<? extends T2> other, Func2<? super T,? super T2,? extends R> zipFunction)
public final <T2,R> Observable<R> zipWith(java.lang.Iterable<? extends T2> other, Func2<? super T,? super T2,? extends R> zipFunction)

接受两个参数,第一个提供一堆Observable,第二个是一个FuncN实现。与上面的操作符不同,这个操作符通过第二个参数FuncN实现来合并一堆Observable发出的序列的每个item。并且这样的合并有着严格的次序,具体说来就是,最终合并得来的Observable发出序列的第一个item是每个要合并的Observable发出序列的第一个item传入FuncN实现得到的结果,然后依次类推。所以最终合并得来的Observable能发出的item个数和那一堆被合并的Observable中能发出item个数最少的items数量相等。zipWith不过是Observable实例的方法,与zip同理,注意一下zipWith(Iterable,Func2)的第一个参数,不是Observable而是Iterable,但是不用说也能心领神会我想说什么了吧。

combineLatest

public static <T,R> Observable<R> combineLatest(java.util.List<? extends Observable<? extends T>> sources, FuncN<? extends R> combineFunction)
public static <T1,T2,R> Observable<R> combineLatest(Observable<? extends T1> o1,  Observable<? extends T2> o2, Func2<? super T1,? super T2,? extends R> combineFunction)
......
public static <T1,T2,T3,T4,T5,T6,T7,T8,T9,R> Observable<R> combineLatest(Observable<? extends T1> o1,
                                                         Observable<? extends T2> o2,
                                                         Observable<? extends T3> o3,
                                                         Observable<? extends T4> o4,
                                                         Observable<? extends T5> o5,
                                                         Observable<? extends T6> o6,
                                                         Observable<? extends T7> o7,
                                                         Observable<? extends T8> o8,
                                                         Observable<? extends T9> o9,
                                                         Func9<? super T1,? super T2,? super T3,? super T4,? super T5,? super T6,? super T7,? super T8,? super T9,? extends R> combineFunction)

和zip操作符很像,但和zip不同的是,zip操作符是按严格次序来合并一堆源Observable释放序列的每个item而作为创建的新Observable释放序列的item的,也就是说新的Observale释放序列的第一个item是所有源Observable释放序列的第一个item通过zip的第二个参数FuncN实现合并而成的,之后的第二、第三等等以此类推。combineLatest通过FuncN实现来合并每个源Observable最近释放的item来构成新建的Observable释放序列的item的。

join、groupJoin

public final <TRight,TLeftDuration,TRightDuration,R> Observable<R> join(Observable<TRight> right, Func1<T,Observable<TLeftDuration>> leftDurationSelector, Func1<TRight,Observable<TRightDuration>> rightDurationSelector, Func2<T,TRight,R> resultSelector)

public final <T2,D1,D2,R> Observable<R> groupJoin(Observable<T2> right, Func1<? super T,? extends Observable<D1>> leftDuration, Func1<? super T2,? extends Observable<D2>> rightDuration,  Func2<? super T,? super Observable<T2>,? extends R> resultSelector)

注意这两个家伙是Observable实例的方法。理解这两个方法的参数很关键,前三个参数都是一样的,第四个参数有些区别。第一个参数是要和源Observable合并的Observable;第二个参数是一个Func1实现接受一个参数就是源Observable释放的item,返回一个Observable管理一个时间窗口;第三个参数也是一个Func1实现接受一个参数就是要合并的Observable释放的item,同样返回一个Observable管理着一个时间窗口;如果上面两个Observable管理的时间窗口有交集,那么第四个参数也就是一个Func2实现就会起来发挥合并的作用了,Func2实现接受两个参数,对于join方法,前两个参数是处在时间窗口交集中源Observable和要合并的Observable释放的item,而对于groupJoin第一个参数是处在时间窗口交集中源Observable释放的item,第二个参数是处在时间窗口交集中由要合并的Observable释放的item经groupJoin的第三个参数Func1实现返回的管理时间窗口的Observable。这两个方法新建的Observable释放的item就是上面Func2实现的返回值了。

switchOnNext

public static <T> Observable<T> switchOnNext(Observable<? extends Observable<? extends T>> sequenceOfSequences)

这个简单一点。接受一个释放Observable的Observable作为参数。switchOnNext观察这个释放Observable的Observable,当有Observable释放出来的时候switchOnNext新建的Observable就释放这个Observable释放的item,当有新的Observable释放出来的时候switchOnNext停止释放上一个Observable释放的item转而释放这个新释放的Observable释放的item,依次类推。(-:这句子,实在前无古人后无来者,太起伏了,太跌宕了-:)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,928评论 6 509
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,748评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,282评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,065评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,101评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,855评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,521评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,414评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,931评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,053评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,191评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,873评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,529评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,074评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,188评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,491评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,173评论 2 357

推荐阅读更多精彩内容

  • 作者: maplejaw本篇只解析标准包中的操作符。对于扩展包,由于使用率较低,如有需求,请读者自行查阅文档。 创...
    maplejaw_阅读 45,683评论 8 93
  • 本篇文章介主要绍RxJava中操作符是以函数作为基本单位,与响应式编程作为结合使用的,对什么是操作、操作符都有哪些...
    嘎啦果安卓兽阅读 2,863评论 0 10
  • 注:只包含标准包中的操作符,用于个人学习及备忘参考博客:http://blog.csdn.net/maplejaw...
    小白要超神阅读 2,197评论 2 8
  • 创建操作 用于创建Observable的操作符Create通过调用观察者的方法从头创建一个ObservableEm...
    rkua阅读 1,831评论 0 1
  • 响应式编程简介 响应式编程是一种基于异步数据流概念的编程模式。数据流就像一条河:它可以被观测,被过滤,被操作,或者...
    说码解字阅读 3,070评论 0 5