到目前为止,我们已经看到了一些运算符,它们以某种方式将多个序列压扁为同一类型。接下来的运算符将源序列并排放置,并使用这些值来创建复合值。
zip
zip是函数式编程中的一个非常基本的函数。它需要两个或多个序列,并按索引将它们的值一对一地匹配起来。需要一个函数来组合这些值。与您对其他环境的期望不同,在RxJavazip中,默认情况下不会将所有值组合在一个元组中。
在下一个示例中,我们有两个源,它们以不同的速率发出项。
日志输出:
如果我把right改成300毫秒,可以看到另一半默默地等待
如我们所见,zip基于索引匹配值。
zip有多个重载,用于将两个以上的序列压缩在一起。
当压缩两个以上的序列时,运算符将等待所有源发出下一个值,然后再发出下一个压缩值。在下一个示例中,我们再次添加具有自己频率的另一个源。
日志输出:
压缩序列在任何源序列成功终止时终止。其他序列的进一步值将被忽略。我们可以在下一个示例中看到这一点,其中我们压缩了不同大小的序列,并计算了压缩序列中的元素。
日志输出:
压缩序列包含的元素与最短的源序列一样多。
另外还有zipWith操作符,这是zip序列的另一种样式。zipWith允许您在一个链中压缩,但它可能不方便压缩两个以上的序列。
日志输出:
zipWith还具有一个重载,允许您将可观察到sequence压缩为一个可迭代的序列。
日志输出:
combineLatest
在zip使用索引的地方,cominelatest将使用时间。每当一个被组合的观测值发出一个值时,该值与另一个可观察到的最新值组合在一起。同样,需要一个函数来组合这些值。
日志输出:
如我们所见,CompineLateest首先它等待每个序列都有一个值。在此之后,由任何一个可观察到的值发出的每一个值都会导致一个组合值被释放。
就像我们在本章中看到的每个Combinator一样,存在允许组合两个以上序列的重载。
喜欢把Comoninelatest看作是一个事件发生在另一个事件的上下文中,当使用来自GUI的输入(多个有状态GUI控件影响相同的输出)时,Comoninelatest非常有用。想象一下,一个文本输入字段,一个与文本相呼应的段落,以及一个标记是否大写的复选框。每当文本字段或复选框更改时,cominelatest都会将文本与是否将其大写的决定结合起来。最终结果已准备好写入输出。
下次继续!!!
原文链接:
https://github.com/Froussios/Intro-To-RxJava/blob/master/Part%203%20-%20Taming%20the%20sequence/4.%20Combining%20sequences.md
代码:https://github.com/woshiyexinjie/rxjava-leaner
有什么讨论的内容,可以加我公众号: