Последний элемент
излучает только последний элемент (или последний элемент, удовлетворяющий некоторому условию), излучённый Observable
Если вас интересует только последний элемент, излучённый Observable, или последний элемент, удовлетворяющий определённым критериям, вы можете отфильтровать Observable с помощью оператора Последний.
В некоторых реализациях Last не реализован как оператор фильтрации, возвращающий Observable, а как блокирующая функция, возвращающая конкретный элемент при завершении источника Observable. В таких реализациях, если вам нужен оператор фильтрации, у вас может быть больше успеха с TakeLast(1).
См. также
Информация, специфичная для языка
RxGroovy last lastOrDefault
В RxGroovy этот оператор фильтрации реализован как last и lastOrDefault.
Несколько запутанно, но также существуют операторы BlockingObservable под названием last и lastOrDefault, которые блокируют выполнение и возвращают элементы, а не сразу возвращают Observables.
Операторы фильтрации
Чтобы отфильтровать Observable, так чтобы был излучен только последний элемент, используйте оператор last без параметров.
- Javadoc:
last()
Вы также можете передать функцию-предикат в last, в этом случае она сгенерирует Observable, который излучит только последний элемент из исходного Observable, для которого предикат принимает значение true.
- Javadoc:
last(Func1)
Оператор lastOrDefault похож на last, но вы передаёте ему значение по умолчанию, которое он может излучить, если исходный Observable не излучит ни одного элемента.
- Javadoc:
lastOrDefault(T)
lastOrDefault также имеет вариант, в который вы можете передать функцию-предикат, чтобы её Observable излучал последний элемент из исходного Observable, для которого предикат принимает значение true, или элемент по умолчанию, если ни один элемент, излучаемый исходным Observable, не прошёл предикат.
- Javadoc:
lastOrDefault(T)
last и lastOrDefault по умолчанию не работают с каким-либо конкретным расписанием.
Методы BlockingObservable
Методы BlockingObservable не преобразуют Observable в другой, отфильтрованный Observable, а вместо этого прерывают цепочку Observable, блокируют выполнение, пока Observable не излучит желаемый элемент, и возвращают этот элемент.
Чтобы преобразовать Observable в BlockingObservable, чтобы вы могли использовать эти методы, вы можете использовать либо метод Observable.toBlocking, либо BlockingObservable.from.
- Javadoc:
Observable.toBlocking() - Javadoc:
BlockingObservable.from(Observable)
Чтобы получить последнее излучение из BlockingObservable, используйте метод last без параметров.
- Javadoc:
BlockingObservable.last()
Вы также можете передать функцию-предикат в метод last для получения последнего излучения из BlockingObservable, который удовлетворяет предикату.
- Javadoc:
BlockingObservable.last(Func1)
Как и в случае с операторами фильтрации, метод last объекта BlockingObservable выбросит NoSuchElementException, если в источнике BlockingObservable нет последнего элемента. Чтобы вернуть значение по умолчанию в таких случаях, используйте метод lastOrDefault.
- Javadoc:
BlockingObservable.lastOrDefault()
И, как и в случае с last, есть вариант lastOrDefault, который принимает функцию-предикат в качестве аргумента и извлекает последний элемент из источника BlockingObservable, который удовлетворяет этому предикату, или значение по умолчанию, если такой элемент не был излучен.
RxJava 1․x last lastOrDefault
В RxJava этот оператор фильтрации реализован как last и lastOrDefault.
Несколько запутанно, но также существуют операторы BlockingObservable под названием last и lastOrDefault которые блокируют выполнение и возвращают элементы, а не сразу возвращают Observables.
Операторы фильтрации
Чтобы отфильтровать 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.
- Javadoc:
last()
Вы также можете передать функцию-предикат в last, в этом случае она сгенерирует Observable, который излучит только последний элемент из исходного Observable, для которого предикат принимает значение true.
- Javadoc:
last(Func1)
Оператор lastOrDefault похож на last, но вы передаёте ему значение по умолчанию, которое он может излучить, если исходный Observable не излучит ни одного элемента.
- Javadoc:
lastOrDefault(T)
lastOrDefault также имеет вариант, в который вы можете передать функцию-предикат, чтобы её Observable излучал последний элемент из исходного Observable, для которого предикат принимает значение true, или элемент по умолчанию, если ни один элемент, излучаемый исходным Observable, не прошёл предикат.
- Javadoc:
lastOrDefault(T)
last и lastOrDefault по умолчанию не работают с каким-либо конкретным расписанием.
Методы BlockingObservable
Методы BlockingObservable не преобразуют Observable в другой, отфильтрованный Observable, а вместо этого прерывают цепочку Observable, блокируют выполнение, пока Observable не излучит желаемый элемент, и возвращают этот элемент.
Чтобы преобразовать Observable в BlockingObservable, чтобы вы могли использовать эти методы, вы можете использовать либо метод Observable.toBlocking, либо BlockingObservable.from.
- Javadoc:
Observable.toBlocking() - Javadoc:
BlockingObservable.from(Observable)
Чтобы получить последнее излучение из BlockingObservable, используйте метод last без параметров.
- Javadoc:
BlockingObservable.last()
Вы также можете передать функцию-предикат в метод last для получения последнего излучения из BlockingObservable, который удовлетворяет предикату.
- Javadoc:
BlockingObservable.last(Func1)
Как и в случае с операторами фильтрации, метод last объекта BlockingObservable выбросит NoSuchElementException, если в источнике BlockingObservable нет последнего элемента. Чтобы вернуть значение по умолчанию в таких случаях, используйте метод lastOrDefault.
- Javadoc:
BlockingObservable.lastOrDefault()
И, как и в случае с last, есть вариант lastOrDefault, который принимает функцию-предикат в качестве аргумента и извлекает последний элемент из источника BlockingObservable, который удовлетворяет этому предикату, или значение по умолчанию, если такой элемент не был излучен.
RxJS last
RxJS реализует оператор last. Он необязательно принимает функцию-предикат в качестве параметра, в этом случае, вместо выдачи последнего элемента из исходного Observable, результирующий Observable выдает последний элемент из исходного Observable, удовлетворяющий предикату.
Функция-предикат сама принимает три аргумента:
- элемент из исходного Observable, который должен или не должен быть отфильтрован
- нулевой индекс этого элемента в последовательности исходного 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 завершается с уведомлением «Sequence contains no elements.» 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.jsrx.all.compat.jsrx.aggregates.js
Он требует одного из следующих дистрибутивов:
rx.jsrx.compat.jsrx.lite.jsrx.lite.compat.js
© ReactiveX contributors
Licensed under the Apache License 2.0.
http://reactivex.io/documentation/operators/last.html