Несколько запросов на модификацию2 объединены в хэш-карту с rxJava2

У меня есть список объектов: ArrayList<T> arrayList; и на каждом объекте списка есть Id: T.getId() который мне нужен для выполнения запроса. В ответ выбирается другой список объектов: ArrayList<E> anotherList

Я хочу сделать несколько вызовов на основе идентификатора: T.getId() и для каждого ответа я хочу объединить этот объект: T с ответом: ArrayList<E> anotherList на хэш-карте: Hashmap<T, ArrayList<E> anotherList> и вернуть значение после завершения всех запросов. Есть ли способ добиться этого с помощью rxJava?:

//For every `T.getId()`, fetch `ArrayList<E> anotherList` 
for(int i=0; i<arrayList.size(); i++){
    T object = arrayList.get(i);
    fetchData(T.getId());
}

при каждом onNext() слиянии(hashmap.put()) T с ответом ArrayList<E> anotherList на Hashmap<T, ArrayList<E> anotherList>. После завершения всех запросов верните окончательный hashmap, содержащий эти пары:

retrofit.fetchData(T.getId())
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .flatMap(...)
        .merge(...)
        .subscribeWith(...)

Есть ли способ добиться этого?


person hrskrs    schedule 23.02.2017    source источник


Ответы (1)


Я думаю, вы можете создать поле: private HashMap<Integer,ArrayList<E>> mHashMap;

После того, как это поле было создано, вы можете попробовать:

Observable.just(arrayList)
                .flatMapIterable(new Function<ArrayList<T>, Iterable<? extends T>>() {
                    @Override
                    public Iterable<? extends T> apply(ArrayList<T> ts) throws Exception {
                        return ts;
                    }
                }).flatMap(new Function<T, ObservableSource<Hashmap<T,ArrayList<E>>>>() {
                    @Override
                    public ObservableSource<Hashmap<T,ArrayList<E>>> apply(T t) throws Exception {
                        return Observable.fromCallable(new Callable<Hashmap<T,ArrayList<E>>>() {
                            @Override
                            public Hashmap<T,ArrayList<E>> call() throws Exception {
                                mHashMap.put(t, fetchData(t.getId()));
                                return mHashMap;
                            }
                        });
                    }
                });

flatMapIterable используется для получения каждого элемента arrayList, а flatMap позволяет вам использовать каждый элемент для создания связанного наблюдаемого, который вам нужен.

Затем используйте DisposableObserver, чтобы получить при обратном вызове onNext промежуточное завершенное HashMap<Integer,ArrayList<E>>, а при обратном вызове onCompleted — полностью завершенное HashMap.

Надеюсь это поможет.

Извините за мой английский.

person Cochi    schedule 23.02.2017