Skip and Take
其余的过滤操作是如此的相似,可以把它们看作一个类型。首先我们来看一下Skip和Take,它们都只有一个参数,就是要跳过或获取的数量。
先来看Skip,下面这个例子中的Range队列的10个元素将会被跳过3个:
Output:
3
4
5
6
7
8
9
Completed
可以看到,前面的3个元素(0、1、2)被跳过了。另外,如果我们使用的是Take(3)将会得到相反的结果,也就是我们会只得到0、1、2这3个值:
Output:
0
1
2
Completed
为了防止错漏,Take操作一旦完成就会收到它的计数,我们可以通过将它应用到无限队列来证明这一点:
Output:
0
1
2
Completed
SkipWhile and TakeWhile
SkipWhile操作将会持续过滤值直到断言(Func类型委托参数)第一次返回false为止。
Output:
4
3
2
1
0
Completed
我们可以看到4之前的数值都因为符合小于4的断言而被忽略了,直到4断言返回了false,4被打印了出来,其后的数值仍然小于4,但也被打印了出来。而TakeWhile正相反,它将会返回所有的值,当断言第一次返回false,然后队列将会complete
Output:
1
2
3
Completed
SkipLast and TakeLast
SkipLast可以缓存所有值,等待source sequence(源队列)完成后再将除了最后的指定个元素以外的元素重放出来。它实际上实现的方式是将指定数量的消息用Queue组织起来,一旦超过指定的数量,就从中抽掉。
Output:
Pushing 1
Pushing 2
Pushing 3
1
Pushing 4
2
Completed
在上面的例子中我们可以看到,最后的两个元素3和4被忽略掉了。
TakeLast忽略队列的前指定个元素,它必须等待source sequence(源队列)完成才能发表结果:
Output:
Pushing 1
Pushing 2
Pushing 3
Pushing 4
Completing
3
4
Completed
在上面的输出中,前2个元素1和2被忽略了。
SkipUntil and TakeUntil
这两个方法将需要两个可观测物队列。SkipUntil将会以可观测物队列B产生任何值的时间为时间点,跳过可观测物队列A中在此时间点之前产生的所有值。
Output:
4
5
6
7
Completed
在上面的输出中,我们看到在otherSubject.OnNext(Unit.Default)之前的消息(1、2、3)被忽略了。
TakeWhile与之相反。队列B产生第一个值之后TakeWhile将会完成队列A。
Output:
1
2
3
Completed
我们看到,otherSubject.OnNext(Unit.Default)之后的所有消息都被忽略了。
暂无关于此日志的评论。