Свести Observable‹Observable‹Cursor›› к Observable‹Cursor›

У меня есть Observable, который возвращает один экземпляр Cursor (Observable<Cursor>). Я пытаюсь использовать ContentObservable.fromCursor для получения каждой строки курсора в обратном вызове onNext.

Одно из решений, которое я придумал, это такая конструкция:

ContentObservable.fromCursor(cursorObservable.toBlocking().first())
    .subscribe(cursor -> {
        // map to object 
        // add to outer collection
    }, e -> {}, () -> { 
        // do something with list of objects (outer collection)
    });

Это выглядит как взлом из-за toBlocking().first(), но это работает. Мне это не нравится, потому что большая часть обработки выполняется в обратном вызове onNext, и нам нужно создать внешнюю коллекцию для хранения промежуточных результатов.

Я хотел использовать его так:

cursorObservable.map(ContentObservable::fromCursor)
    .map(fromCursor -> fromCursor.toBlocking().first())
    .map(/* map to object */)
    .toList()
    .subscribe(objects -> {
        // do something with list of objects
    }

Это по-прежнему использует toBlocking().first() и не работает, потому что после завершения наблюдаемого fromCursor курсор закрывается, поэтому нет возможности сопоставить его с объектом. Есть ли лучший способ сгладить Observable<Observable<Cursor>> до Observable<Cursor>?


person tomrozb    schedule 06.05.2015    source источник


Ответы (1)


Есть ли лучший способ сгладить Observable<Observable<Cursor>> до Observable<Cursor>?

Да, вы можете использовать метод Observable.concat:

public static void main(String[] args) {
    final Observable<String> observable = Observable.just("1", "2");
    final Observable<Observable<String>> nested = observable.map(value -> Observable.just(value + "1", value + "2"));
    final Observable<String> flattened = Observable.concat(nested);

    flattened.subscribe(System.out::println);
}

ОБНОВЛЕНИЕ

На самом деле есть несколько других способов преобразовать Observable<Observable<Cursor>> в Observable<Cursor>:

Просто выберите тот, который больше подходит вам.

ОБНОВЛЕНИЕ 2

Другое решение — немного изменить код и использовать оператор flatMap вместо map:

cursorObservable.flatMap(ContentObservable::fromCursor)
    .map(/* map to object */)
    .toList()
    .subscribe(objects -> {
        // do something with list of objects (outer collection)
    }
person Vladimir Mironov    schedule 06.05.2015