Spec-Zone.ru › ReactiveX

Последний элемент

излучает только последний элемент (или последний элемент, удовлетворяющий некоторому условию), излучённый Observable
Открыть интерактивную диаграмму на rxmarbles.com

Если вас интересует только последний элемент, излучённый Observable, или последний элемент, удовлетворяющий определённым критериям, вы можете отфильтровать Observable с помощью оператора Последний.

В некоторых реализациях Last не реализован как оператор фильтрации, возвращающий Observable, а как блокирующая функция, возвращающая конкретный элемент при завершении источника Observable. В таких реализациях, если вам нужен оператор фильтрации, у вас может быть больше успеха с TakeLast(1).

См. также

  • ElementAt
  • Первый
  • Take
  • TakeLast
  • Введение в Rx: Последний
  • RxMarbles: last

Информация, специфичная для языка

RxGroovy last lastOrDefault

В RxGroovy этот оператор фильтрации реализован как last и lastOrDefault.

Несколько запутанно, но также существуют операторы BlockingObservable под названием last и lastOrDefault, которые блокируют выполнение и возвращают элементы, а не сразу возвращают Observables.

Операторы фильтрации

last

Чтобы отфильтровать Observable, так чтобы был излучен только последний элемент, используйте оператор last без параметров.

  • Javadoc: last()
last

Вы также можете передать функцию-предикат в last, в этом случае она сгенерирует Observable, который излучит только последний элемент из исходного Observable, для которого предикат принимает значение true.

  • Javadoc: last(Func1)
lastOrDefault

Оператор lastOrDefault похож на last, но вы передаёте ему значение по умолчанию, которое он может излучить, если исходный Observable не излучит ни одного элемента.

  • Javadoc: lastOrDefault(T)
lastOrDefault

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)
last

Чтобы получить последнее излучение из BlockingObservable, используйте метод last без параметров.

  • Javadoc: BlockingObservable.last()
last

Вы также можете передать функцию-предикат в метод last для получения последнего излучения из BlockingObservable, который удовлетворяет предикату.

  • Javadoc: BlockingObservable.last(Func1)
lastOrDefault

Как и в случае с операторами фильтрации, метод last объекта BlockingObservable выбросит NoSuchElementException, если в источнике BlockingObservable нет последнего элемента. Чтобы вернуть значение по умолчанию в таких случаях, используйте метод lastOrDefault.

  • Javadoc: BlockingObservable.lastOrDefault()
lastOrDefault

И, как и в случае с last, есть вариант lastOrDefault, который принимает функцию-предикат в качестве аргумента и извлекает последний элемент из источника BlockingObservable, который удовлетворяет этому предикату, или значение по умолчанию, если такой элемент не был излучен.

  • Javadoc: BlockingObservable.lastOrDefault(Func1)

RxJava 1․x last lastOrDefault

В RxJava этот оператор фильтрации реализован как last и lastOrDefault.

Несколько запутанно, но также существуют операторы BlockingObservable под названием last и lastOrDefault которые блокируют выполнение и возвращают элементы, а не сразу возвращают Observables.

Операторы фильтрации

last

Чтобы отфильтровать 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

Вы также можете передать функцию-предикат в last, в этом случае она сгенерирует Observable, который излучит только последний элемент из исходного Observable, для которого предикат принимает значение true.

  • Javadoc: last(Func1)
lastOrDefault

Оператор lastOrDefault похож на last, но вы передаёте ему значение по умолчанию, которое он может излучить, если исходный Observable не излучит ни одного элемента.

  • Javadoc: lastOrDefault(T)
lastOrDefault

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)
last

Чтобы получить последнее излучение из BlockingObservable, используйте метод last без параметров.

  • Javadoc: BlockingObservable.last()
last

Вы также можете передать функцию-предикат в метод last для получения последнего излучения из BlockingObservable, который удовлетворяет предикату.

  • Javadoc: BlockingObservable.last(Func1)
lastOrDefault

Как и в случае с операторами фильтрации, метод last объекта BlockingObservable выбросит NoSuchElementException, если в источнике BlockingObservable нет последнего элемента. Чтобы вернуть значение по умолчанию в таких случаях, используйте метод lastOrDefault.

  • Javadoc: BlockingObservable.lastOrDefault()
lastOrDefault

И, как и в случае с last, есть вариант lastOrDefault, который принимает функцию-предикат в качестве аргумента и извлекает последний элемент из источника BlockingObservable, который удовлетворяет этому предикату, или значение по умолчанию, если такой элемент не был излучен.

  • Javadoc: BlockingObservable.lastOrDefault(Func1)

RxJS last

last

RxJS реализует оператор last. Он необязательно принимает функцию-предикат в качестве параметра, в этом случае, вместо выдачи последнего элемента из исходного Observable, результирующий Observable выдает последний элемент из исходного Observable, удовлетворяющий предикату.

Функция-предикат сама принимает три аргумента:

  1. элемент из исходного Observable, который должен или не должен быть отфильтрован
  2. нулевой индекс этого элемента в последовательности исходного Observable
  3. объект исходного 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.js
  • rx.all.compat.js
  • rx.aggregates.js

Он требует одного из следующих дистрибутивов:

  • rx.js
  • rx.compat.js
  • rx.lite.js
  • rx.lite.compat.js

© ReactiveX contributors
Licensed under the Apache License 2.0.
http://reactivex.io/documentation/operators/last.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API