如果您只对 Observable 发射的最后一个项目感兴趣,或者满足某些条件的最后一个项目,您可以使用 Last 操作符过滤 Observable。
在某些实现中,Last
不是作为返回 Observable 的过滤操作符实现的,而是作为在源 Observable 终止时返回特定项目的阻塞函数实现的。在这些实现中,如果您需要一个过滤操作符,您可能可以使用 TakeLast(1)
获得更好的结果。
待定
在 RxGroovy 中,此过滤操作符实现为 last
和 lastOrDefault
。
有点令人困惑的是,还有一些名为 last
和 lastOrDefault
的 BlockingObservable
操作符会阻塞并返回项目,而不是立即返回 Observable。
要过滤 Observable,使其仅发射最后一个发射,请使用不带参数的 last
操作符。
last()
您也可以将谓词函数传递给 last
,在这种情况下,它将生成一个 Observable,该 Observable 仅发射源 Observable 中谓词评估为 true
的最后一个项目。
last(Func1)
lastOrDefault
操作符类似于 last
,但您可以传递一个默认项目,如果源 Observable 无法发射任何项目,它可以发射该项目。
lastOrDefault(T)
lastOrDefault
还有一个变体,您可以将谓词函数传递给它,这样它的 Observable 将发射源 Observable 中谓词评估为 true
的最后一个项目,或者如果源 Observable 发射的任何项目都没有通过谓词,则发射默认项目。
lastOrDefault(T)
last
和 lastOrDefault
默认情况下不会在任何特定的 Scheduler 上操作。
BlockingObservable
方法BlockingObservable
方法不会将 Observable 转换为另一个过滤的 Observable,而是会从 Observable 级联中退出,阻塞直到 Observable 发射所需的项目,然后返回该项目本身。
要将 Observable 转换为 BlockingObservable
以便您可以使用这些方法,您可以使用 Observable.toBlocking
或 BlockingObservable.from
方法。
Observable.toBlocking()
BlockingObservable.from(Observable)
要检索 BlockingObservable
的最后一个发射,请使用不带参数的 last
方法。
BlockingObservable.last()
您也可以将谓词函数传递给 last
方法,以检索满足谓词的 BlockingObservable
的最后一个发射。
BlockingObservable.last(Func1)
与过滤操作符一样,BlockingObservable
的 last
方法将在源 BlockingObservable
中没有最后一个元素时抛出 NoSuchElementException
。要在这种情况下返回默认项目,请使用 lastOrDefault
方法。
BlockingObservable.lastOrDefault()
并且,与 last
一样,有一个 lastOrDefault
变体接受谓词函数作为参数,并检索满足该谓词的源 BlockingObservable
的最后一个项目,或者如果没有发射满足的项目,则检索默认项目。
在 RxJava 中,此过滤操作符实现为 last
和 lastOrDefault
。
有点令人困惑的是,还有一些名为 last
和 lastOrDefault
的 BlockingObservable
操作符会阻塞并返回项目,而不是立即返回 Observable。
要过滤 Observable,使其仅发射最后一个发射,请使用不带参数的 last
操作符。
Observable.just(1, 2, 3) .last() .subscribe(new Subscriber<Integer>() { @Override public void onNext(Integer item) { System.out.println("Next: " + item); } @Override public void onError(Throwable error) { System.err.println("Error: " + error.getMessage()); } @Override public void onCompleted() { System.out.println("Sequence complete."); } });
Next: 3 Sequence complete.
last()
您也可以将谓词函数传递给 last
,在这种情况下,它将生成一个 Observable,该 Observable 仅发射源 Observable 中谓词评估为 true
的最后一个项目。
last(Func1)
lastOrDefault
操作符类似于 last
,但您可以传递一个默认项目,如果源 Observable 无法发射任何项目,它可以发射该项目。
lastOrDefault(T)
lastOrDefault
还有一个变体,您可以将谓词函数传递给它,这样它的 Observable 将发射源 Observable 中谓词评估为 true
的最后一个项目,或者如果源 Observable 发射的任何项目都没有通过谓词,则发射默认项目。
lastOrDefault(T)
last
和 lastOrDefault
默认情况下不会在任何特定的 Scheduler 上操作。
BlockingObservable
方法BlockingObservable
方法不会将 Observable 转换为另一个过滤的 Observable,而是会从 Observable 级联中退出,阻塞直到 Observable 发射所需的项目,然后返回该项目本身。
要将 Observable 转换为 BlockingObservable
以便您可以使用这些方法,您可以使用 Observable.toBlocking
或 BlockingObservable.from
方法。
Observable.toBlocking()
BlockingObservable.from(Observable)
要检索 BlockingObservable
的最后一个发射,请使用不带参数的 last
方法。
BlockingObservable.last()
您也可以将谓词函数传递给 last
方法,以检索满足谓词的 BlockingObservable
的最后一个发射。
BlockingObservable.last(Func1)
与过滤操作符一样,BlockingObservable
的 last
方法将在源 BlockingObservable
中没有最后一个元素时抛出 NoSuchElementException
。要在这种情况下返回默认项目,请使用 lastOrDefault
方法。
BlockingObservable.lastOrDefault()
并且,与 last
一样,有一个 lastOrDefault
变体接受谓词函数作为参数,并检索满足该谓词的源 BlockingObservable
的最后一个项目,或者如果没有发射满足的项目,则检索默认项目。
RxJS 实现 last
操作符。它可以选择接受谓词函数作为参数,在这种情况下,它不会发射源 Observable 的最后一个项目,而是发射满足谓词的源 Observable 的最后一个项目。
谓词函数本身接受三个参数
var source = Rx.Observable.range(0, 10) .last(function (x, idx, obs) { return x % 2 === 1; }); var subscription = source.subscribe( function (x) { console.log('Next: ' + x); }, function (err) { console.log('Error: ' + err); }, function () { console.log('Completed'); });
Next: 8 Completed
如果源 Observable 没有发射任何项目(或没有发射与谓词匹配的项目),last
将以“序列不包含任何元素。
” onError
通知终止。
如果您希望 Observable 在这种情况下发射一个默认值,您可以将第二个参数(名为 defaultValue
)传递给 last
var source = Rx.Observable.range(0, 10) .last(function (x, idx, obs) { return x > 42; }, 88 ); var subscription = source.subscribe( function (x) { console.log('Next: ' + x); }, function (err) { console.log('Error: ' + err); }, function () { console.log('Completed'); });
Next: 88 Completed
last
位于以下每个发行版中
rx.all.js
rx.all.compat.js
rx.aggregates.js
它需要以下发行版之一
rx.js
rx.compat.js
rx.lite.js
rx.lite.compat.js