任何时候,只要在另一个Observable发射的数据定义的时间窗口内,这个Observable发射了一条数据,就结合两个Observable发射的数据。Join操作符结合两个Observable发射的数据,基于时间窗口(你定义的针对每条数据特定的原则)选择待集合的数据项。你将这些时间窗口实现为一些Observables,它们的生命周期从任何一条Observable发射的每一条数据开始。
当两个Observables中的任何一个发射了数据时,使用一个函数结合每个Observable发射的最近数据项,并且基于这个函数的结果发射数据。CombineLatest操作符行为类似于zip,但是只有当原始的Observable中的每一个都发射了一条数据时zip才发射数据。CombineLatest则在原始的Observable中任意一个发射了数据时发射一条数据。
使用Pattern和Plan作为中介,将两个或多个Observable发射的数据集合并到一起And/Then/When操作符组合的行为类似于zip,但是它们使用一个中间数据结构。接受两个或多个Observable,一次一个将它们的发射物合并到Pattern对象,然后操作那个Pattern对象,变换为一个Plan。随后将这些Plan变换为Observable的发射物。它们属于rxjava-joins模块,不是核心RxJava包的一部分。
这个页面展示的操作符可用于组合多个Observables。
发射Observable发射的最后N项数据使用TakeLast操作符修改原始Observable,你可以只发射Observable'发射的后N项数据,忽略前面的数据。taskLast.n使用takeLast操作符,你可以只发射原始Observable发射的后N项数据,忽略之前的数据。注意:这会延迟原始Observable发射的任何数据项,直到它全部完成。takeLast的这个变体默认不在任何特定的调度器上执行。
只发射前面的N项数据使用Take操作符让你可以修改Observable的行为,只返回前面的N项数据,然后发射完成通知,忽略剩余的数据。RxJava将这个操作符实现为take函数。如果你对一个Observable使用take(n)(或它的同义词limit(n))操作符,而那个Observable发射的数据少于N项,那么take操作生成的Observable不会抛异常或发射onError通知,在完成前它只会发射相同的少量数据。
抑制Observable发射的后N项数据使用SkipLast操作符修改原始Observable,你可以忽略Observable'发射的后N项数据,只保留前面的数据。使用SkipLast操作符,你可以忽略原始Observable发射的后N项数据,只保留之前的数据。注意:这个机制是这样实现的:延迟原始Observable发射的任何数据项,直到它发射了N项数据。skipLast的这个变体默认不在任何特定的调度器上执行。
抑制Observable发射的前N项数据使用Skip操作符,你可以忽略Observable'发射的前N项数据,只保留之后的数据。RxJava中这个操作符叫skip。skip的这个变体默认不在任何特定的调度器上执行。Javadoc: skip(int)skip的这个变体接受一个时长而不是数量参数。它会丢弃原始Observable开始的那段时间发射的数据,时长和时间单位通过参数指定。
定期发射Observable最近发射的数据项Sample操作符定时查看一个Observable,然后发射自上次采样以来它最近发射的数据。在某些实现中,有一个ThrottleFirst操作符的功能类似,但不是发射采样期间的最近的数据,而是发射在那段时间内的第一项数据。RxJava将这个操作符实现为sample和throttleLast。
只发射最后一项(或者满足某个条件的最后一项)数据如果你只对Observable发射的最后一项数据,或者满足某个条件的最后一项数据感兴趣,你可以使用Last操作符。在某些实现中,Last没有实现为一个返回Observable的过滤操作符,而是实现为一个在当时就发射原始Observable指定数据项的阻塞函数。在这些实现中,如果你想要的是一个过滤操作符,最好使用TakeLast(1)。
不发射任何数据,只发射Observable的终止通知IgnoreElements操作符抑制原始Observable发射的所有数据,只允许它的终止通知(onError或onCompleted)通过。如果你不关心一个Observable发射的数据,但是希望在它完成时或遇到错误终止时收到通知,你可以对Observable使用ignoreElements操作符,它会确保永远不会调用观察者的onNext()方法。
只发射第一项(或者满足某个条件的第一项)数据如果你只对Observable发射的第一项数据,或者满足某个条件的第一项数据感兴趣,你可以使用First操作符。在某些实现中,First没有实现为一个返回Observable的过滤操作符,而是实现为一个在当时就发射原始Observable指定数据项的阻塞函数。在这些实现中,如果你想要的是一个过滤操作符,最好使用Take(1)或者ElementAt(0)。
只发射通过了谓词测试的数据项Filter操作符使用你指定的一个谓词函数测试数据项,只有通过测试的数据才会被发射。RxJava将这个操作符实现为filter函数。示例代码Observable.just(1, 2, 3, 4, 5) .filter(new Func1<Integer, Boolean>
只发射第N项数据ElementAt操作符获取原始Observable发射的数据序列指定索引位置的数据项,然后当做自己的唯一数据发射。RxJava将这个操作符实现为elementAt,给它传递一个基于0的索引值,它会发射原始Observable数据序列对应索引位置的值,如果你传递给elementAt的值为5,那么它会发射第六项的数据。
抑制(过滤掉)重复的数据项Distinct的过滤规则是:只允许还没有发射过的数据项通过。在某些实现中,有一些变体允许你调整判定两个数据不同(distinct)的标准。还有一些实现只比较一项数据和它的直接前驱,因此只会从序列中过滤掉连续重复的数据。distinct()RxJava将这个操作符实现为distinct函数。示例代码Observable.just(1, 2, 1, 1, 2, 3) .
仅在过了一段指定的时间还没发射数据时才发射一个数据Debounce操作符会过滤掉发射速率过快的数据项。RxJava将这个操作符实现为throttleWithTimeout和debounce。注意:这个操作符会会接着最后一项数据发射原始Observable的onCompleted通知,即使这个通知发生在你指定的时间窗口内(从最后一项数据的发射算起)。也就是说,onCompleted通知不会触发限流。
这个页面展示的操作符可用于过滤和选择Observable发射的数据序列。
定期将来自原始Observable的数据分解为一个Observable窗口,发射这些窗口,而不是每次发射一项数据Window和Buffer类似,但不是发射来自原始Observable的数据包,它发射的是Observables,这些Observables中的每一个都发射原始Observable数据的一个子集,最后发射一个onCompleted通知。
连续地对数据序列的每一项应用一个函数,然后连续发射结果Scan操作符对原始Observable发射的第一项数据应用一个函数,然后将那个函数的结果作为自己的第一项数据发射。它将函数的结果同第二项数据一起填充给这个函数来产生它自己的第二项数据。它持续进行这个过程来产生剩余的数据序列。这个操作符在某些情况下被叫做accumulator。RxJava实现了scan操作符。
对Observable发射的每一项数据应用一个函数,执行变换操作Map操作符对原始Observable发射的每一项数据应用一个你选择的函数,然后返回一个发射这些结果的Observable。RxJava将这个操作符实现为map函数。这个操作符默认不在任何特定的调度器上执行。
关注时代Java