RxJava中的不好理解的点-join、Debounce or Sample操作符

接触了RxJava一段时间后,对一些operation的理解还是不到位,这里分析总结下。

Debounce or Sample

debounce的原意大致是“去抖动; 防抖动; 弹跳”,sample的意思是“采样,抽样“,从Reactivex.io上的介绍来看,两者非常相似; 有一个显著差别是:

  1. debounce函数过滤掉由Observable发射的速率过快的数据;如果在一个指定的时间间隔过去了仍旧没有发射一个,那么它将发射最后的那个。


2. sample定期从Observable发射的数据中取最后一个,如果某个时期内没有数据发射,那么这段时期内就没有被观察的数据,他不会发射最后一个。

First or Single

两者都是只从数据源中返回一个符合条件的数据,但是single在Observable结束时都没有合适的数据时会抛出一个NoSuchElementException异常

这里写图片描述

这里写图片描述

合并多个Observable

Rx有很多预定义的针对Observable的Operation,根据操作的类型可以分为过滤,变换,组合,而join属于组合这一类;
组合实际上就是有多个Observable,但是我们希望的是多输入单输出,也就是多对一;那么根据合并的不同特性有merge,zip,join等等;
- merge按顺序合并两个Observable发出的数据
- zip按顺序打包两个Obserable发出数据的合体;
- 那么join呢?

在阅读了RxJava Essential和Reactivex.io上的解释后,还是很难理解,官方的示例图也是基本没看明白:

这里写图片描述

总算皇天不负有心人,在反复查阅英文资料后终于在Rx的起源处C# Rx中找到了能理解的说明http://www.introtorx.com/uat/content/v1.0.10621.0/17_SequencesOfCoincidence.html#Join

When left produces a value, a window is opened. That value is also then passed to the leftDurationSelector function. The result of this function is an IObservable<TLeftDuration>. When that sequence produces a value or completes then the window for that value is closed. Note that it is irrelevant what the type of TLeftDuration is. This initially left me with the feeling that IObservable<TLeftDuration> was all a bit over kill as you effectively just need some sort of event to say 'Closed'. However by allowing you to use IObservable<T> you can do some clever stuff as we will see later.

So let us first imagine a scenario where we have the left sequence producing values twice as fast as the right sequence. Imagine that we also never close the windows. We could do this by always returning Observable.Never<Unit>() from the leftDurationSelector function. This would result in the following pairs being produced.

Left Sequence

L 0-1-2-3-4-5-
Right Sequence

R --A---B---C-
0, A
1, A
0, B
1, B
2, B
3, B
0, C
1, C
2, C
3, C
4, C
5, C
As you can see the left values are cached and replayed each time the right produces a value.

发射数据元素,第二个数据源B,每发射一个数据,我们都把它和第一个数据源A中已经发射的数据进行一对一匹配;

举例来说,如果某一时刻B发射了一个数据“B”,此时A已经发射了0,1,2,3共四个数据,那么我们的合并操作就会把“B”依次与0,1,2,3配对,得到四组数据: 0, B 1, B 2, B 3, B

是不是和简单?可惜我在在花费大量时间研究出join本质前,一直无法理解,希望本文能帮助到遇到同样问题的人;

小结

所以join得本质就是这么简单,但是很遗憾在RxJava的各种介绍和Github上面对join都是一笔带过,并没有把他的概念讲清楚,如果读者在细致的学习RxJava时就会遇到很多问题。

本文出处:http://avenwu.net

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值