Для
преобразования Observable в другой объект или структуру данных
Различные языковые реализации ReactiveX имеют множество операторов, которые можно использовать для преобразования Observable или последовательности элементов, испускаемых Observable, в другой тип объекта или структуры данных. Некоторые из этих операторов ожидают завершения Observable и затем генерируют эквивалентный объект или структуру данных; другие возвращают Observable, который испускает такой объект или структуру данных.
В некоторых реализациях ReactiveX также есть оператор, который преобразует Observable в «блокирующее» Observable. Блокирующее Observable расширяет обычное Observable, предоставляя набор методов, работающих с элементами, испускаемыми Observable, которые блокируют выполнение. Некоторые операторы To находятся в этом наборе расширенных операций блокирующего Observable.
См. также
Информация, специфичная для языка
RxGroovy BlockingObservable.from BlockingObservable.getIterator nest toBlocking BlockingObservable.toFuture BlockingObservable.toIterable toList toMap toMultiMap toSortedList
Оператор getIterator применяется к подклассу BlockingObservable, поэтому для его использования необходимо сначала преобразовать исходное Observable в BlockingObservable с помощью метода BlockingObservable.from или оператора Observable.toBlocking.
Этот оператор преобразует Observable в Iterator, с помощью которого можно перебирать набор элементов, испускаемых исходным Observable.
- Javadoc:
BlockingObservable.getIterator()
Оператор toFuture применяется к подклассу BlockingObservable, поэтому для его использования необходимо сначала преобразовать исходное Observable в BlockingObservable с помощью метода BlockingObservable.from или оператора Observable.toBlocking.
Этот оператор преобразует Observable в Future, который вернёт единственный элемент, испущенный исходным Observable. Если исходное Observable испускает более одного элемента, Future получит IllegalArgumentException; если оно завершается, не испустив ни одного элемента, Future получит NoSuchElementException.
Если вы хотите преобразовать Observable, которое может испустить несколько элементов, в Future, попробуйте что-то вроде этого: myObservable.toList().toBlocking().toFuture().
- Javadoc:
BlockingObservable.toFuture()
Оператор toIterable применяется к подклассу BlockingObservable, поэтому для его использования необходимо сначала преобразовать исходное Observable в BlockingObservable с помощью метода BlockingObservable.from или оператора Observable.toBlocking.
Этот оператор преобразует Observable в Iterable, с помощью которого можно перебирать набор элементов, испускаемых исходным Observable.
- Javadoc:
BlockingObservable.toIterable()
Обычно Observable, испускающее несколько элементов, делает это, вызывая метод onNext своего наблюдателя для каждого такого элемента. Вы можете изменить это поведение, указав Observable составить список этих нескольких элементов, а затем вызвать метод onNext наблюдателя только один раз, передав ему весь список, применив оператор toList к Observable.
Например, следующий довольно бесполезный код принимает список целых чисел, преобразует его в Observable, а затем преобразует это Observable в Observable, который испускает исходный список как единственный элемент:
Пример кода
numbers = Observable.from([1, 2, 3, 4, 5, 6, 7, 8, 9]);
numbers.toList().subscribe(
{ println(it); }, // onNext
{ println("Error: " + it.getMessage()); }, // onError
{ println("Sequence complete"); } // onCompleted
); [1, 2, 3, 4, 5, 6, 7, 8, 9] Sequence complete
Если исходное Observable вызывает onCompleted до испускания каких-либо элементов, Observable, возвращаемое toList, испустит пустой список перед вызовом onCompleted. Если исходное Observable вызывает onError, Observable, возвращаемое toList, немедленно вызовет методы onError своих наблюдателей.
toList по умолчанию не работает с каким-либо конкретным расписанием.
- Javadoc:
toList()
Оператор toMap собирает элементы, испускаемые исходным Observable, в карту (по умолчанию, HashMap, но вы можете указать функцию-фабрику, генерирующую другую разновидность Map) и затем испускает эту карту. Вы предоставляете функцию, которая генерирует ключ для каждого испускаемого элемента. Вы также можете указать функцию, которая преобразует испускаемый элемент в значение, хранящееся в карте (по умолчанию, сам элемент).
toMap по умолчанию не работает с каким-либо конкретным расписанием.
- Javadoc:
toMap(Func1) - Javadoc:
toMap(Func1,Func1) - Javadoc:
toMap(Func1,Func1,Func0)
Оператор toMultiMap похож на toMap, за исключением того, что генерируемая им карта также является ArrayList (по умолчанию; или вы можете передать необязательный метод-фабрику в качестве четвёртого параметра, чтобы генерировать разновидность коллекции по вашему усмотрению).
toMultiMap по умолчанию не работает с каким-либо конкретным расписанием.
- Javadoc:
toMultiMap(Func1) - Javadoc:
toMultiMap(Func1,Func1) - Javadoc:
toMultiMap(Func1,Func1,Func0) - Javadoc:
toMultiMap(Func1,Func1,Func0,Func1)
Оператор toSortedList ведет себя очень похоже на toList, за исключением того, что он сортирует полученный список. По умолчанию он сортирует список естественным образом в порядке возрастания с помощью интерфейса Comparable. Если какой-либо из элементов, испускаемых Observable, не поддерживает Comparable по отношению к типу любого другого элемента, испускаемого Observable, toSortedList выбросит исключение. Однако вы можете изменить это поведение по умолчанию, передав в toSortedList функцию, которая принимает в качестве параметров два элемента и возвращает число; toSortedList затем будет использовать эту функцию вместо Comparable для сортировки элементов.
Например, следующий код принимает список неотсортированных целых чисел, преобразует его в Observable, а затем преобразует это Observable в Observable, который испускает исходный список в отсортированном виде как единственный элемент:
Пример кода
numbers = Observable.from([8, 6, 4, 2, 1, 3, 5, 7, 9]);
numbers.toSortedList().subscribe(
{ println(it); }, // onNext
{ println("Error: " + it.getMessage()); }, // onError
{ println("Sequence complete"); } // onCompleted
); [1, 2, 3, 4, 5, 6, 7, 8, 9] Sequence complete
Вот пример, предоставляющий собственную функцию сортировки: в данном случае функция, сортирующая числа в зависимости от их близости к числу 5.
numbers = Observable.from([8, 6, 4, 2, 1, 3, 5, 7, 9]);
numbers.toSortedList({ n, m -> Math.abs(5-n) - Math.abs(5-m) }).subscribe(
{ println(it); }, // onNext
{ println("Error: " + it.getMessage()); }, // onError
{ println("Sequence complete"); } // onCompleted
); [5, 6, 4, 3, 7, 8, 2, 1, 9] Sequence complete
toSortedList по умолчанию не работает с каким-либо конкретным расписанием.
- Javadoc:
toSortedList() - Javadoc:
toSortedList(Func2)
RxGroovy также имеет оператор nest, который имеет одну конкретную цель: он преобразует исходное Observable в Observable, которое испускает это исходное Observable в качестве единственного элемента.
RxJava 1․x BlockingObservable.from BlockingObservable.getIterator nest toBlocking BlockingObservable.toFuture BlockingObservable.toIterable toList toMap toMultiMap toSortedList
Оператор getIterator применяется к подклассу BlockingObservable, поэтому для его использования необходимо сначала преобразовать исходное Observable в BlockingObservable с помощью метода BlockingObservable.from или оператора Observable.toBlocking.
Этот оператор преобразует Observable в Iterator, с помощью которого можно перебирать набор элементов, испускаемых исходным Observable.
- Javadoc:
BlockingObservable.getIterator()
Оператор toFuture применяется к подклассу BlockingObservable, поэтому для его использования необходимо сначала преобразовать исходное Observable в BlockingObservable с помощью метода BlockingObservable.from или оператора Observable.toBlocking.
Этот оператор преобразует Observable в Future , который вернёт единственный элемент, испускаемый исходным Observable. Если исходное Observable испускает более одного элемента, Future получит IllegalArgumentException; если оно завершится, не испустив ни одного элемента, Future получит NoSuchElementException.
Если вы хотите преобразовать Observable, который может испускать несколько элементов, в Future, попробуйте что-нибудь вроде этого: myObservable.toList().toBlocking().toFuture().
- Javadoc:
BlockingObservable.toFuture()
Оператор toIterable применяется к подклассу BlockingObservable, поэтому для его использования необходимо сначала преобразовать исходное Observable в BlockingObservable с помощью метода BlockingObservable.from или оператора Observable.toBlocking.
Этот оператор преобразует Observable в Iterable, с помощью которого можно перебирать набор элементов, испускаемых исходным Observable.
- Javadoc:
BlockingObservable.toIterable()
Обычно Observable, испускающее несколько элементов, делает это, вызывая метод наблюдателя onNext для каждого такого элемента. Вы можете изменить это поведение, указав Observable составить список этих нескольких элементов и затем вызвать метод наблюдателя onNext только один раз, передав ему весь список, применив оператор toList к Observable.
Если исходное Observable вызывает onCompleted до испускания каких-либо элементов, Observable, возвращаемое toList, испустит пустой список перед вызовом onCompleted. Если исходное Observable вызывает onError, Observable, возвращаемое toList, немедленно вызовет методы onError своих наблюдателей.
Оператор toList по умолчанию не работает с каким-либо конкретным Планировщиком.
- Javadoc:
toList()
Оператор toMap собирает элементы, испускаемые исходным Observable, в карту (по умолчанию, HashMap, но вы можете по желанию предоставить функцию-фабрику, которая генерирует другую разновидность Map) и затем испускает эту карту. Вы предоставляете функцию, которая генерирует ключ для каждого испускаемого элемента. Вы также можете по желанию предоставить функцию, которая преобразует испускаемый элемент в значение, хранящееся в карте (по умолчанию, сам элемент является этим значением).
Оператор toMap по умолчанию не работает с каким-либо конкретным Планировщиком.
- Javadoc:
toMap(Func1) - Javadoc:
toMap(Func1,Func1) - Javadoc:
toMap(Func1,Func1,Func0)
Оператор toMultiMap аналогичен оператору toMap, за исключением того, что создаваемая им карта также является ArrayList (по умолчанию; или вы можете передать необязательный метод-фабрику в качестве четвёртого параметра, с помощью которого вы генерируете предпочитаемую вами разновидность коллекции).
Оператор toMultiMap по умолчанию не работает с каким-либо конкретным Планировщиком.
- Javadoc:
toMultiMap(Func1) - Javadoc:
toMultiMap(Func1,Func1) - Javadoc:
toMultiMap(Func1,Func1,Func0) - Javadoc:
toMultiMap(Func1,Func1,Func0,Func1)
Оператор toSortedList ведет себя очень похоже на toList, за исключением того, что он сортирует полученный список. По умолчанию он сортирует список естественным образом по возрастанию с помощью интерфейса Comparable. Если какой-либо из элементов, испускаемых Observable, не поддерживает Comparable относительно типа каждого другого элемента, испускаемого Observable, toSortedList выбросит исключение. Однако, вы можете изменить это поведение по умолчанию, также передав в toSortedList функцию, которая принимает в качестве параметров два элемента и возвращает число; toSortedList будет использовать эту функцию вместо Comparable для сортировки элементов.
Оператор toSortedList по умолчанию не работает с каким-либо конкретным Планировщиком.
- Javadoc:
toSortedList() - Javadoc:
toSortedList(Func2)
RxJava также имеет оператор nest, который имеет одну конкретную цель: он преобразует исходное Observable в Observable, которое испускает это исходное Observable в качестве единственного элемента.
RxJS toArray toMap toSet
Обычно Observable, испускающее несколько элементов, делает это, вызывая метод наблюдателя onNext для каждого такого элемента. Вы можете изменить это поведение, указав Observable составить массив этих нескольких элементов и затем вызвать метод наблюдателя onNext только один раз, передав ему весь массив, применив оператор toArray к Observable.
Пример кода
var source = Rx.Observable.timer(0, 1000)
.take(5)
.toArray();
var subscription = source.subscribe(
function (x) { console.log('Next: ' + x); },
function (err) { console.log('Error: ' + err); },
function () { console.log('Completed'); }); Next: [0,1,2,3,4] Completed
toArray представлен в каждом из следующих наборов распределений:
rx.jsrx.all.jsrx.all.compat.jsrx.compat.jsrx.lite.jsrx.lite.compat.js
Оператор toMap собирает элементы, испускаемые исходным Observable, в Map и затем испускает эту карту. Вы предоставляете функцию, которая генерирует ключ для каждого испускаемого элемента. Вы также можете по желанию предоставить функцию, которая преобразует испускаемый элемент в значение, хранящееся в карте (по умолчанию, сам элемент является этим значением).
Пример кода
var source = Rx.Observable.timer(0, 1000)
.take(5)
.toMap(function (x) { return x * 2; }, function (x) { return x * 4; });
var subscription = source.subscribe(
function (x) {
var arr = [];
x.forEach(function (value, key) { arr.push(value, key); })
console.log('Next: ' + arr);
},
function (err) { console.log('Error: ' + err); },
function () { console.log('Completed'); }); Next: [0,0,2,4,4,8,6,12,8,16] Completed
toMap представлен в каждом из следующих наборов распределений:
rx.all.jsrx.all.compat.jsrx.aggregates.js
Обычно Observable, испускающее несколько элементов, делает это, вызывая метод наблюдателя onNext для каждого такого элемента. Вы можете изменить это поведение, указав Observable составить Set этих нескольких элементов и затем вызвать метод наблюдателя onNext только один раз, передав ему весь Set, применив оператор toSet к Observable.
Обратите внимание, что это работает только в среде ES6 или с полифилами.
var source = Rx.Observable.timer(0, 1000)
.take(5)
.toSet();
var subscription = source.subscribe(
function (x) {
var arr = [];
x.forEach(function (i) { arr.push(i); })
console.log('Next: ' + arr);
},
function (err) { console.log('Error: ' + err); },
function () { console.log('Completed'); }); Next: [0,1,2,3,4] Completed
toSet представлен в каждом из следующих наборов распределений:
rx.all.jsrx.all.compat.jsrx.aggregates.js
RxPHP toArray
RxPHP реализует этот оператор как toArray.
Создаёт последовательность observable, содержащую единственный элемент, который представляет собой массив, содержащий все элементы исходной последовательности.
Пример кода
//from https://github.com/ReactiveX/RxPHP/blob/master/demo/toArray/toArray.php
$source = \Rx\Observable::fromArray([1, 2, 3, 4]);
$observer = $createStdoutObserver();
$subscription = $source->toArray()
->subscribe(new CallbackObserver(
function ($array) use ($observer) {
$observer->onNext(json_encode($array));
},
[$observer, "onError"],
[$observer, "onCompleted"]
)); Next value: [1,2,3,4] Complete!
© ReactiveX contributors
Licensed under the Apache License 2.0.
http://reactivex.io/documentation/operators/to.html