Первый
выдавать только первый элемент (или первый элемент, удовлетворяющий какому-либо условию), выдаваемый Observable
Если вас интересует только первый элемент, выдаваемый Observable, или первый элемент, удовлетворяющий определенным критериям, вы можете отфильтровать Observable с помощью оператора First.
В некоторых реализациях First не реализуется как оператор фильтрации, возвращающий Observable, а как блокирующая функция, возвращающая конкретный элемент в момент, когда исходный Observable выдает этот элемент. В таких реализациях, если вам нужен оператор фильтрации, вам может повезти с Take(1) или ElementAt(0).
В некоторых реализациях также есть оператор Single. Он ведет себя аналогично оператору First, за исключением того, что он ждет, пока исходный Observable завершит работу, чтобы гарантировать, что он выдает только один элемент (в противном случае, вместо выдачи этого элемента, он завершается с ошибкой). Вы можете использовать это не только для получения первого элемента из исходного Observable, но и для гарантии, что был только один элемент.
См. также
- ElementAt
- Last
- Take
- Введение в Rx: Первый
- Введение в Rx: Single
- Загрузка данных из нескольких источников с помощью RxJava Дэном Левом (пример использования Concat и First)
- RxMarbles:
find - RxMarbles:
findIndex - RxMarbles:
first
Информация, специфичная для языка
RxGroovy first firstOrDefault latest mostRecent next single singleOrDefault takeFirst
В RxGroovy этот оператор фильтрации реализован как first, firstOrDefault, и takeFirst.
Несколько непонятно, что также существуют операторы BlockingObservable под названием first и firstOrDefault, которые блокируют и затем возвращают элементы, а не сразу возвращают Observables.
Также есть несколько других операторов, которые выполняют аналогичные функции.
Операторы фильтрации
Для фильтрации Observable таким образом, чтобы излучалось только первое излучение, используйте оператор first без параметров.
- Javadoc:
first()
Вы также можете передать функцию предиката в first, в этом случае она будет генерировать Observable, который излучает только первый элемент из исходного Observable, который предикат оценивает как true.
- Javadoc:
first(Func1)
Оператор firstOrDefault аналогичен first, но вы передаёте ему значение по умолчанию, которое он может излучить, если исходный Observable не излучает никаких элементов.
- Javadoc:
firstOrDefault(T)
firstOrDefault также имеет вариант, в который вы можете передать функцию предиката, таким образом, чтобы его Observable излучал первый элемент из исходного Observable, который предикат оценивает как true, или значение по умолчанию, если ни один элемент, излучаемый исходным Observable, не пройдёт предикат.
- Javadoc:
firstOrDefault(T)
Оператор takeFirst аналогичен оператору first, за исключением поведения этих операторов, когда исходный Observable не излучает элементов, удовлетворяющих предикату. В таком случае first выбросит исключение NoSuchElementException, в то время как takeFirst вернёт пустой Observable (который вызовет onCompleted, но никогда не вызовет onNext).
- Javadoc:
takeFirst(Func1)
Оператор single аналогичен first, но выбрасывает исключение NoSuchElementException, если исходный Observable не излучает ровно один элемент перед успешным завершением.
- Javadoc:
single()
single также имеет версию, которая принимает предикат и излучает единственный элемент, излученный исходным Observable, который соответствует этому предикату, или оповещает об исключении, если ровно один такой элемент не соответствует.
- Javadoc:
single(Func1)
Как и с firstOrDefault, существует также singleOrDefault, который излучает элемент по умолчанию, если исходный Observable пустой, хотя он всё равно оповестит об ошибке, если исходный Observable излучит более одного элемента.
- Javadoc:
singleOrDefault(T)
И также есть версия singleOrDefault, которая принимает функцию предиката и излучает единственный элемент из исходного Observable, который соответствует этому предикату, если такой есть; элемент по умолчанию, если таких элементов нет; и оповещает об ошибке, если таких элементов несколько.
- Javadoc:
singleOrDefault(Func1,T)
first, firstOrDefault, single, singleOrDefault, и takeFirst по умолчанию не работают с каким-либо конкретным Scheduler.
Методы BlockingObservable
Методы BlockingObservable не преобразуют Observable в другой, отфильтрованный Observable, а скорее прерывают цепочку Observable, блокируя, пока Observable не излучит нужный элемент, а затем возвращают этот элемент сам по себе.
Чтобы преобразовать Observable в BlockingObservable для использования этих методов, вы можете использовать либо методы Observable.toBlocking или BlockingObservable.from.
- Javadoc:
Observable.toBlocking() - Javadoc:
BlockingObservable.from(Observable)
Для получения первого излучения из BlockingObservable используйте метод first без параметров.
- Javadoc:
BlockingObservable.first()
Вы также можете передать функцию предиката в метод first для получения первого излучения из BlockingObservable, удовлетворяющего предикату.
- Javadoc:
BlockingObservable.first(Func1)
Как и с операторами фильтрации, метод first класса BlockingObservable выбросит исключение NoSuchElementException, если в исходном BlockingObservable нет первого элемента. Чтобы вернуть элемент по умолчанию в таких случаях, используйте метод firstOrDefault.
- Javadoc:
BlockingObservable.firstOrDefault()
И, как и с first, есть вариант firstOrDefault, который принимает функцию предиката в качестве аргумента и возвращает первый элемент из исходного BlockingObservable , удовлетворяющий этому предикату, или элемент по умолчанию, если такой элемент не был излучен.
Оператор single аналогичен first, но выбрасывает исключение NoSuchElementException, если исходный Observable не излучает ровно один элемент до успешного завершения.
- Javadoc:
single()
single также имеет версию, которая принимает предикат и возвращает единственный элемент, излученный исходным Observable, который соответствует этому предикату, или выбрасывает исключение, если ровно один такой элемент не соответствует.
- Javadoc:
single(Func1)
Как и с firstOrDefault, есть также singleOrDefault, который возвращает элемент по умолчанию, если исходный Observable пустой, хотя он всё равно выбросит исключение, если исходный Observable излучит более одного элемента.
- Javadoc:
singleOrDefault(T)
И также есть версия singleOrDefault , которая принимает функцию предиката и возвращает единственный элемент из исходного Observable, который соответствует этому предикату, если таковой имеется; элемент по умолчанию, если таких элементов нет; и выбрасывает исключение, если таких элементов несколько.
- Javadoc:
singleOrDefault(Func1,T)
Оператор next блокирует, пока BlockingObservable не излучит другой элемент, и затем возвращает этот элемент. Вы можете вызывать эту функцию многократно, чтобы получать последовательные элементы из BlockingObservable, эффективно итерируясь по его излучениям в блокирующем режиме.
Оператор latest аналогичен, но вместо блокирования в ожидании следующего излучаемого элемента, он сразу возвращает самый последний излученный элемент и блокируется только если Observable ещё ничего не излучил.
Оператор mostRecent аналогичным образом позволяет итерироваться по излучениям BlockingObservable, но его Iterable всегда сразу возвращает значение: либо элемент по умолчанию, который вы предоставили (если BlockingObservable ещё не излучил элемент), или последний излученный элемент, который излучил BlockingObservable.
- Javadoc:
mostRecent(T)
RxJava 1․x first firstOrDefault latest mostRecent next single singleOrDefault takeFirst
В RxJava этот оператор фильтрации реализован как first, firstOrDefault, и takeFirst.
Несколько непонятно, что есть также операторы BlockingObservable с названиями first и firstOrDefault, которые блокируют выполнение и затем возвращают элементы, а не сразу возвращают Observables.
Также есть несколько других операторов, выполняющих подобные функции.
Операторы фильтрации
Для фильтрации Observable, чтобы выводить только его первое значение, используйте оператор first без параметров.
Пример кода
Observable.just(1, 2, 3)
.first()
.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: 1 Sequence complete.
- Javadoc:
first()
Вы также можете передать функцию предиката в first, в этом случае он создаст Observable, который будет выводить только первый элемент из исходного Observable, который предикат оценивает как true.
- Javadoc:
first(Func1)
Оператор firstOrDefault похож на first, но вы передаёте ему значение по умолчанию, которое он может вывести, если исходный Observable не выводит никаких значений.
- Javadoc:
firstOrDefault(T)
firstOrDefault также имеет вариант, в который можно передать функцию предиката, так что его Observable будет выводить первый элемент из исходного Observable, который предикат оценивает как true, или значение по умолчанию, если ни один элемент, выведенный исходным Observable, не проходит предикат.
- Javadoc:
firstOrDefault(T)
Оператор takeFirst ведет себя аналогично first, за исключением того, как эти операторы ведут себя, когда исходный Observable не выводит никаких элементов, удовлетворяющих предикату. В таком случае first сгенерирует исключение NoSuchElementException, а takeFirst вернёт пустой Observable (тот, который вызовет onCompleted, но никогда не вызовет onNext).
- Javadoc:
takeFirst(Func1)
Оператор single аналогичен first, но генерирует исключение NoSuchElementException, если исходный Observable не выводит ровно один элемент до успешного завершения.
- Javadoc:
single()
single также имеет версию, принимающую предикат, и выводит единственный элемент, выведенный исходным Observable, который соответствует этому предикату, или сообщает об ошибке, если ровно один такой элемент не соответствует.
- Javadoc:
single(Func1)
Как и с firstOrDefault, есть также singleOrDefault, который выводит элемент по умолчанию, если исходный Observable пустой, хотя он по-прежнему сообщит об ошибке, если исходный Observable выведет более одного элемента.
- Javadoc:
singleOrDefault(T)
И также есть версия singleOrDefault которая принимает функцию предиката и выводит единственный элемент из исходного Observable, который соответствует этому предикату, если таковой имеется; элемент по умолчанию, если таких элементов нет; и генерирует сообщение об ошибке, если таких элементов несколько.
- Javadoc:
singleOrDefault(Func1,T)
first, firstOrDefault, single, singleOrDefault, и takeFirst по умолчанию не работают ни на каком конкретном Scheduler.
Методы BlockingObservable
Методы BlockingObservable не преобразуют Observable в другой, отфильтрованный Observable, а вместо этого прерывают цепочку Observable, блокируют выполнение, пока Observable не выведет нужный элемент, и затем возвращают этот элемент.
Чтобы преобразовать Observable в BlockingObservable для использования этих методов, можно использовать методы Observable.toBlocking или BlockingObservable.from.
- Javadoc:
Observable.toBlocking() - Javadoc:
BlockingObservable.from(Observable)
Чтобы получить первое значение из BlockingObservable, используйте метод first без параметров.
- Javadoc:
BlockingObservable.first()
Вы также можете передать функцию предиката в метод first для получения первого значения из BlockingObservable, удовлетворяющего предикату.
- Javadoc:
BlockingObservable.first(Func1)
Как и операторы фильтрации, метод first класса BlockingObservable сгенерирует исключение NoSuchElementException, если в исходном BlockingObservable нет первого элемента. Для возврата значения по умолчанию в таких случаях используйте метод firstOrDefault.
- Javadoc:
BlockingObservable.firstOrDefault()
И, как и с first, существует вариант firstOrDefault, который принимает функцию предиката в качестве аргумента и получает первый элемент из исходного BlockingObservable, который удовлетворяет этому предикату, или значение по умолчанию вместо него, если такой элемент не был выведен.
Оператор single аналогичен first, но генерирует исключение NoSuchElementException, если исходный Observable не выводит ровно один элемент до успешного завершения.
- Javadoc:
single()
single также имеет версию, которая принимает предикат, и возвращает единственный элемент, выведенный исходным Observable, который соответствует этому предикату, или генерирует исключение, если ровно один такой элемент не соответствует.
- Javadoc:
single(Func1)
Как и с firstOrDefault, есть также singleOrDefault, который возвращает значение по умолчанию, если исходный Observable пуст, хотя он по-прежнему сгенерирует исключение, если исходный Observable выведет более одного элемента.
- Javadoc:
singleOrDefault(T)
И также существует версия singleOrDefault метода, которая принимает функцию предиката и возвращает единственный элемент из исходного Observable, который соответствует этому предикату, если такой есть; значение по умолчанию, если таких элементов нет; и генерирует исключение, если таких элементов несколько.
- Javadoc:
singleOrDefault(Func1,T)
Оператор next блокирует выполнение, пока BlockingObservable не выведет другой элемент, а затем возвращает этот элемент. Вы можете вызывать эту функцию многократно, чтобы получить последовательные элементы из BlockingObservable, эффективно итеративно проходя его выводы в блокирующем режиме.
Оператор latest похож, но вместо того, чтобы блокировать ожидание следующего выведенного элемента, он сразу возвращает последний выведенный элемент и блокируется только если Observable ещё ничего не выводил.
Оператор mostRecent аналогично позволяет итерироваться по выводам BlockingObservable, но его Iterable всегда сразу возвращает значение: либо элемент по умолчанию, который вы предоставляете (если BlockingObservable ещё не вывел элемент), либо последний выведенный элемент BlockingObservable.
- Javadoc:
mostRecent(T)
RxJS find findIndex first single
RxJS реализует оператор first. Он необязательно принимает функцию-предикат в качестве параметра, в этом случае, вместо того, чтобы испускать первый элемент из исходного Observable, результирующий Observable будет испускать первый элемент из исходного Observable, который удовлетворяет предикату.
Сама функция предиката принимает три аргумента:
- элемент из исходного Observable, который должен или не должен быть отфильтрован
- нулево-базовая позиция этого элемента в последовательности исходного Observable
- объект исходного Observable
Необязательный третий параметр (называемый defaultValue) позволяет выбрать элемент, который first будет испускать, если исходный Observable не испускает никаких элементов (или если он не испускает n-й ожидаемый элемент).
Пример кода
var source = Rx.Observable.range(0, 10)
.first(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: 1 Completed
Если исходный Observable не испускает никаких элементов (или не испускает элементов, соответствующих предикату), first завершится с уведомлением «Sequence contains no elements.» onError.
Оператор single похож, за исключением того, что он испускает свой элемент только после того, как исходный Observable успешно завершается после испускания одного элемента (или одного элемента, соответствующего предикату). Если он испускает либо такие элементы нет, либо более одного такого элемента, single завершится с уведомлением onError («Sequence contains no elements.»).
Оператор find очень похож на first, за исключением того, что аргумент предиката является обязательным, и он ведет себя по-другому, если ни один элемент из исходного Observable не соответствует предикату. В то время как first отправит уведомление onError в таком случае, find вместо этого испустит элемент undefined.
Пример кода
var array = [1,2,3,4];
var source = Rx.Observable.fromArray(array)
.find(function (x, i, obs) {
return x === 5;
});
var subscription = source.subscribe(
function (x) { console.log('Next: ' + x); },
function (err) { console.log('Error: ' + err); },
function () { console.log('Completed'); }); Next: undefined Completed
Оператор findIndex похож на find, за исключением того, что вместо испускания элемента, соответствующего предикату (или undefined), он испускает нулево-базовую позицию этого элемента в последовательности исходного Observable (или -1).
Пример кода
var array = [1,2,3,4];
var source = Rx.Observable.fromArray(array)
.findIndex(function (x, i, obs) {
return x === 5;
});
var subscription = source.subscribe(
function (x) { console.log('Next: ' + x); },
function (err) { console.log('Error: ' + err); },
function () { console.log('Completed'); }); Next: -1 Completed
find, findIndex, и first находятся в каждом из следующих дистрибутивов:
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/first.html