RxJava 学习笔记<十二> Combining sequences

Combining sequences


到目前为止,我们已经看到了大多数允许我们创建一个序列并将其转换为我们想要的序列的方法。但是,大多数应用程序将有多个输入源。我们需要一种结合序列的方法。我们已经看到一些序列使用多个可观察到的。在本章中,我们将看到使用多个序列生成一个序列的最重要的运算符。

Concatenation

最直接的序列组合是一个接在另一个后面。

concat

Conat运算符将一个接一个的序列串联起来。有许多重载方法,这允许您以不同的数量和格式提供源可观测数据。

将两个(或更多)给定的可观测值串联起来是很简单的。

输出:

如果要组合的序列的数量是动态的,则可以提供一个可观察到的输出要连接的序列。在本例中,我们将使用熟悉的groupBy创建一个以相同字母开始的单词序列。

输出

Conat的行为类似于ConatMap。实际上,ConatMap是map 后 connat。

ConatWith运算符是另一种执行conat的样式,它允许您在一个链中一个接一个地组合序列:

输出:

repeat

repeat 允许您在序列本身之后连接起来,不管是无限的还是有限的时间。repeat 不会缓存值来重复它们。当时机成熟时,它将开始新的订阅并处理旧的订阅。

写起来也非常方便

输出:

repeatWhen

如果你需要比 repeat 给予的更多的控制,您可以使用 repeatWhen 操作符控制什么时候开始复制。时间由您提供的可观察对象定义。当原始序列完成时,它等待可观察到的处理来发出一些东西(值是不相关的),只有到那时它才会重复。如果可观察到的处理终止,这意味着重复应该停止。

对于信号来说,知道重复何时完成可能是有用的。repeatWhen 提供了一种特殊的可观察到的,当重复结束时会发出无效的信号。你可以用这个观察到的来构造你的信号。

RepeatWhen的参数是一个函数,它接受一个可观察值并返回一个可观察值。这两个对象发出的类型并不重要。输入是表示重复结束的可观察值,返回的可观察值将用于发出重新启动的信号。

在下一例子中吗我们将使用 repeatWhen 创造 repeat(n)

输出:

在这里,重复立即发生:OB在重复结束时发出,因此返回的可观察到的也会在完成重复后立即发出。这标志着新的重复即将开始。

在下一个示例中,我们创建的序列每两秒钟重复一次,直到永远。

请注意,序列每2秒重复一次,而不管它何时完成。这是因为我们创建了一个独立的间隔,每2秒发送一个信号。在下一章中, [Time-shifted sequences](/Part 3 - Taming the sequence/5. Time-shifted sequences.md),我们将看到如何在更多控制的情况下及时处理序列。

另一件需要注意的事情是 ob.subscribe() 语句,它似乎是无用的,但是必要的,因为它迫使ob被创建。在当前的实现中,如果ob没有订阅,那么重复就永远不会开始。

原文链接:

https://github.com/Froussios/Intro-To-RxJava/blob/master/Part%203%20-%20Taming%20the%20sequence/4.%20Combining%20sequences.md

有什么讨论的内容,可以加我微信公众号:

猜你喜欢

转载自my.oschina.net/u/2277632/blog/1806916