博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RxJava 学习笔记<五> Reducing a sequence
阅读量:5804 次
发布时间:2019-06-18

本文共 2121 字,大约阅读时间需要 7 分钟。

hot3.png

到目前为止,我们看到的例子都还比较小,在这里,我们将探索可以过滤掉不相关数据或将数据简化为所需的单个值。

这里的大多数操作符对于任何熟悉Java流或函数编程的人来说都是熟悉的。这里的所有 operators 都返回一个新的observable,并且不影响原始的可观测性。这一原则在整个 Rx 中都存在。observables 转换每一次都会产生一个新的 observable ,并且保持原始的不受影响。原始 observable 的 Subscribers 应该不会注意到任何变化,但是我们将在后面的章节中看到,保证这一点可能需要开发人员引起注意。

Marble diagrams

这是一个适当的时间引入 marble diagrams 的概念。这是解释Rx中的 operators 的一种流行方法,因为它们的直观和图形性质。它们在 RxJava 的文档中有很多,我们只有利用它们的解释性质。格式基本上是不言自明的:时间从左向右流动,形状表示值,斜杠是一个o nCompletion,X 是一个错误。运算符应用于顶部 sequence,结果是下面的 sequence 。

213949_4pkw_2277632.png

Filter

Filter接受一个谓词函数,该谓词函数对发出的每个值做出一个布尔决策。如果判定为false,则筛选序列中省略该项。

public final Observable
filter(Func1
predicate)

214122_z57S_2277632.png

我们将使用过滤器创建一个数字序列,并过滤掉所有偶数,只保留奇数。

214403_PWVL_2277632.png

输出:

214430_e6fD_2277632.png

distinct and distinctUntilChanged

distinct 筛选出去重的任何元素。

214727_rNeh_2277632.png

输出:

214757_KsLU_2277632.png

一个 distinct 的重载需要一个 key 选择器。对于每个项,函数生成一个键,然后使用键来确定。

214910_XZ2u_2277632.png

在这个例子中,我们使用第一个字符作为一个 key。

215030_Ouj6_2277632.png

输出:

215051_4vHT_2277632.png

“Fourth”和“Fifth”被过滤掉,因为它们的第一个字符是‘f’,它已经出现在“First”。

有经验的程序员已经知道,这个 operator 在内部维护一个 set,每个唯一的值都通过 observable 的值传递,并根据它检查每个新的值。虽然 Rx 操作符巧妙地隐藏了这些东西,但您仍然应该意识到 Rx 操作符可能会有很大的成本,并考虑您正在使用它的内容。

distinctUntilChanged 和 distinct 不同之处在于,只有连续的不同的值才会被过滤掉。

221117_ePce_2277632.png

 221238_ZSXC_2277632.png

输出:

221255_W2UD_2277632.png

distinctUntilChanged 也可以使用 key selector。

221424_kTEY_2277632.png

输出:

 

221438_bxjs_2277632.png

ignoreElements

ignoreElements会忽略每一个值,但是让我们通过onCompleted和onError。

221608_UmLV_2277632.png

输出:

221624_y8vG_2277632.png

ignoreElements() 的作用和 filter(v -> false) 类似。

skip and take

下一组方法用于根据项目索引在特定点上按特定点进行顺序操作,或者先取第一部分或第二个子元素。take 取前 n 个元素,skip 是跳过他们,注意,如果序列中的项少于指定索引,则两个函数都认为它是错误。

090908_kEnk_2277632.png

091231_GgMP_2277632.png

输出:

091257_KoEr_2277632.png

java 8 stream 的使用者应该知道 limit 的操作符,在rx中也存在这样的运算符,take 就是这样一个别名,我们很快也会看到更多的重载方法。

一旦第n项可用,take 方法立即完成.。如果发生错误,错误将被转发,但如果发生在切点之后,take 方法则不会关心。

091810_u4lZ_2277632.png

输出:

091826_q2kX_2277632.png

skip 返回 take 的另一半:

091914_huXZ_2277632.png

092020_O9pl_2277632.png

输出:

092034_BL9L_2277632.png

这里有些重载方法限制了时间

094347_0lzW_2277632.png

输出:

094508_m61k_2277632.png

skipWhile and takeWhile

take 和 skip 使用预定义索引工作。如果您想要“发现”截止点,当值出现时,takeWhile和skipWhile将使用谓词。

Observable
takeWhile(Func1
predicate)

095354_giGN_2277632.png

输出:

095408_FWQ9_2277632.png

如你所想的一样,skipWhile 返回另一半:

095557_pdzN_2277632.png

输出:

095616_efjq_2277632.png

skipLast and takeLast

skipLast 和 takeLast 作用类似于 take 和 skip ,不同之处在于结束的位置:

095850_NSMx_2277632.png

输出:

095904_0Pk7_2277632.png

takeUntil and skipUntil

还有两种方法:takeUntil和skipUntil。takeUntil工作完全类似于takeWhile谓词返回false的情况,skipUntil是true的情况。

除此之外,takeUntil 和 skipUntil 都有一个非常有趣的重载,临界点被定义为另一个 observable 发射一个值时。

100340_F1Nv_2277632.png

100508_hhpv_2277632.png

输出:

100535_Mzh1_2277632.png

您可能还记得,这里的计时器将等待250 ms并发出一个事件。这意味着要停止序列。请注意,信号可以是任何类型的,因为实际值不被使用。

skipUntil 按照相同的规则工作,并返回 observable 另一半。值被忽略直到信号开始让值通过。

100824_UXff_2277632.png

输出:

100839_1N3w_2277632.png

223108_3TsV_2277632.png

转载于:https://my.oschina.net/u/2277632/blog/1641503

你可能感兴趣的文章
Java访问文件夹中文件的递归遍历代码Demo
查看>>
项目笔记:测试类的编写
查看>>
如何迅速分析出系统CPU的瓶颈在哪里?
查看>>
通过容器编排和服务网格来改进Java微服务的可测性
查看>>
re:Invent解读:没想到你是这样的AWS
查看>>
PyTips 0x02 - Python 中的函数式编程
查看>>
阿里云安全肖力:安全基础建设是企业数字化转型的基石 ...
查看>>
使用《Deep Image Prior》来做图像复原
查看>>
如何用纯 CSS 为母亲节创作一颗像素画风格的爱心
查看>>
Linux基础命令---rmdir
查看>>
优秀程序员共有的7种优秀编程习惯
查看>>
iOS sqlite3(数据库)
查看>>
粤出"飞龙",打造新制造广东样本
查看>>
编玩边学获数千万元A轮融资,投资方为君联资本
查看>>
开发者论坛一周精粹(第五十五期) 全站HTTPS之OSS教程 一次可以备案几个网站?...
查看>>
(干货)Linux学习资源推荐
查看>>
蓝图(Blueprint)详解
查看>>
Spark之SQL解析(源码阅读十)
查看>>
Android图片添加水印图片并把图片保存到文件存储
查看>>
C#字符串的不变性
查看>>