【RxJava】- 过滤操作符源码分析

目录

【RxJava】- 创建操作符源码分析
【RxJava】- 变换操作符源码分析
【RxJava】- 结合操作符源码分析
【RxJava】- 连接操作符源码分析

Debounce

仅在过了一段指定的时间还没发射数据时才发射一个数据。由类

ObservableDebounce
ObservableDebounceTimed

实现。

ObservableDebounce

被观察者发射数据,调用DebounceObserver的onNext方法。首先获取上一次发射数据时保存的DebounceInnerObserver(一个跳转中转类)实例,如果不为null,者先取消上一次的发射任务,再进行下一数据的发射。

调用debounce传入的数据包装实例,然后拿到包装后的数据进行发射。

所以如果数据发射过快,那么部分数据可能就会丢失。

ObservableDebounceTimed

发射数据是,创建一个延时发射器,当延时时间到达时,调用延时发射器run方法。将发射任务交给被包装的观察者对象SerializedObserver实例。调用SerializedObserver实例的onNext方法发射数据。

  • SerializedObserver
    如果上一个延迟时间没有到,新的数据发射到达时,将取消上一次的延迟计划,开始新的延时计划。

    如果上一个发射还没有完成,处于发射中,那么新的数据被存放在一个数组中,等下一次满足发射条件,然后循环发射所以数据。

Distinct

过滤掉重复的数据项。由

ObservableDistinct
ObservableDistinctUntilChanged
ObservableDistinct
key = Objects.requireNonNull(keySelector.apply(value), "The keySelector returned a null key");
b = collection.add(key);

得到数据,添加到集合(默认是HashSet),如果添加成功这发射数据,否则不发生,这样就可以过滤掉重复的数据项。

ObservableDistinctUntilChanged

ObservableDistinctUntilChanged实现很简单,在发射数据时,先检测是否已经发射过数据,如果已经发射过,就和上一个值进行比较,如果不相同就发射新的数据。

ElementAt

只发射第N项数据。由

ObservableElementAtMaybe
ObservableElementAtSingle

实现。

ObservableElementAtMaybe

实现很简单,自己查看,发射第N项数据。

ObservableElementAtSingle

功能和ObservableElementAtMaybe差不多。

Filter

按照一定规则过滤。由

ObservableFilter

实现

代码实现很简单,调用传入的过滤实例的test方法,如果返回true者发射数据,否则不发射。

First

只发射第一项(或者满足某个条件的第一项)数据,由

ObservableElementAtSingle

实现。
这个上面已经分析过了。

IgnoreElements

不发射任何数据,只发射Observable的终止通知,由

ObservableIgnoreElementsCompletable

实现。自己看源码,onNext中没有任何实现。

Last

只发射最后一项(或者满足某个条件的最后一项)数据。由

ObservableLastMaybe
ObservableLastSingle

实现。在调用onComplete时,发射最后一项数据。

Sample

定期发射Observable最近发射的数据项,由

ObservableSampleTimed
ObservableSampleWithObservable
ObservableSampleTimed

开始一个延时任务,当延时时间到达时,执行数据发射,具体自己看源码,很简单。

ObservableSampleWithObservable

不同的逻辑在SerializedObserver中,这个已经在上面讲解过了。

Skip

抑制Observable发射的前N项数据,由

ObservableSkip
ObservableSkipUntil
ObservableSkipWhile

实现。

ObservableSkip
 if (remaining != 0L) {
       remaining--;
} else {
      downstream.onNext(t);
}

很简单,自己查看源码。

ObservableSkipUntil
@Override
public void subscribeActual(Observer<? super T> child) {
   ...
   other.subscribe(new SkipUntil(frc, sus, serial));
   source.subscribe(sus);
}

直到SkipUntil发射数据,才发射后面的数据,具体自己查看源码。

ObservableSkipWhile
public void onNext(T t) {
    if (notSkipping) {
         downstream.onNext(t);
     } else {
         boolean b;
         ...
            b = predicate.test(t);
         ...
         if (!b) {
             notSkipping = true;
             downstream.onNext(t);
          }
     }
 }

跳过满足条件的数据项。

SkipLast

抑制Observable发射的后N项数据,由

ObservableSkipLast
ObservableSkipLastTimed

实现。

ObservableSkipLastTimed
 if (!empty && ts > now - time) {
     empty = true;
}

if (empty) {
     break;
}

发射数据是存在数组中的当时的时间,time我们传入的间隔时间,只要在now - time发射的数据都会被抛弃。

Take

只发射前面的N项数据,使用Take操作符让你可以修改Observable的行为,只返回前面的N项数据,然后发射完成通知,忽略剩余的数据。具体可以结合上面的内容,里面很多和上面的类似,这里就不一一看源码了。

TakeLast

发射Observable发射的最后N项数据,使用TakeLast操作符修改原始Observable,你可以只发射Observable’发射的后N项数据,忽略前面的数据。

总结

其实过滤操作符大多实现都很简单,自己画几分钟就能看懂。

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

推荐阅读更多精彩内容

  • 一、RxJava操作符概述 RxJava中的操作符就是为了提供函数式的特性,函数式最大的好处就是使得数据处理简洁易...
    无求_95dd阅读 3,071评论 0 21
  • 一、RxJava操作符概述 RxJava中的操作符就是为了提供函数式的特性,函数式最大的好处就是使得数据处理简洁易...
    测天测地测空气阅读 635评论 0 1
  • 注:只包含标准包中的操作符,用于个人学习及备忘参考博客:http://blog.csdn.net/maplejaw...
    小白要超神阅读 2,193评论 2 8
  • ReactiveX 系列文章目录 blockingFirst/blockingLast 阻塞直到返回第一个/最后一...
    三流之路阅读 2,380评论 0 0
  • 记录RxJava操作符,方便查询(2.2.2版本) 英文文档地址:http://reactivex.io/docu...
    凌云飞鱼阅读 823评论 0 0