преобразовать Observable> в Observable>

Я пытаюсь реализовать шаблон репозитория с помощью Realm и RxJava. Интерфейс репозитория имеет такую подпись

Observable<List<T>> query(Specification specification);

Итак, когда я работаю с Realm и хотел бы получить результат "asObservable", я получаю Observable>. Я не мог найти способ преобразовать Observable> в Observable>.

может ли кто-нибудь помочь решить эту проблему?

Я пробовал sth, как это

final Observable<RealmResults<PlantRealm>> realmResults = realm.where(PlantRealm.class)
               .equalTo(PlantTable.ID, "1")
               .findAll().asObservable();

// convert Observable<RealmResults<PlantRealm>> into Observable<List<PlantRealm>>

    return realmResults.flatMap(Observable::from).toList().map(list -> {

                for (PlantRealm plantRealm : list) {
                    plants.add(toPlant.map(plantRealm));
                }
                return Observable.from(plants);
            }
    );

но система проверки типа все еще жалующийся....

return Observable.create( subscriber -> {

       final Realm realm = Realm.getInstance(realmConfiguration);
       final RealmResults<PlantRealm> realmResults = realm.where(PlantRealm.class)
               .equalTo(PlantTable.ID, "1")
               .findAll();

       final List<Plant> plants = new ArrayList<>();

       for (PlantRealm plantRealm : realmResults) {
           plants.add(toPlant.map(plantRealm));
       }

       realm.close();

       subscriber.onNext(plants);
       subscriber.onCompleted();
   });

3 ответов


после просмотра конференции Дэна Лью о Общие Ошибки RxJava ( ошибка выравнивания списка), я нашел ошибку, связанную с этим делом.

Итак, решение для этого случая следующее.

realmResults.flatMap(list ->
            Observable.from(list)
                    .map(plantRealm -> toPlant.map(plantRealm))
                    .toList())

это видео потрясающее, я настоятельно рекомендую посмотреть его.

У меня проблема с этим решением, если я хочу получить доступ к объекту realm из другого потока. Я мог бы разобраться с другим таким же делом, но я ... все еще застрял с этим.

code

console

Я решил эту...

resolved


вы можете сделать следующее:

public Observable<List<AllTypes>> getList() {
  Observable<RealmResults<AllTypes>> obs = realm.where(AllTypes.class).findAll().asObservable();
  return (Observable) obs;
}

return Single.create( e -> {
            ArrayList<SomeModel> arrayList = new ArrayList<>();
            realm.where(SomeModel.class)
                    .findAllSortedAsync("createdOn", Sort.DESCENDING)
                    .asObservable()
                    .filter(RealmResults::isLoaded)
                    .subscribe(someModelsAsRealmResult -> {
                        arrayList.addAll(someModelsAsRealmResult);
                        e.onSuccess(arrayList);
                    });
        });