2014-12-08 5 views
1

Вызов api.bookings возвращает список заказов в предопределенном порядке. Вызов api.order() возвращает бронирование, но с дополнительной информацией. После применения flatMap() порядок списка заказов перепутался. (bookings.toList() - это просто список, если заказы). Как я могу получить значения в zip-функции в порядке, указанном с помощью .from (bookings.toList()). Примечание. Я не могу использовать toSortedList, поскольку у меня нет возможности сравнить два заказа.Как сохранить порядок списка после применения flatMap() к нему?

bookingsSubscription = api.bookings() 
        .flatMap(bookings -> 
         Observable.zip(
          Observable 
           .from(bookings.toList()) 
           .flatMap(booking -> api.order(booking.orderId)), 

          Observable.from(bookings.toList()), 

          (newBooking, oldBooking) -> { 
           // at this point newBooking != oldBooking 
          } 
        ).toList()) 
        .subscribe(callback); 

api.order

ответ

0

ли api.bookings() возвращать горячий или холодный наблюдаемым? Я думаю, что это холод в вашем случае из-за проблемы, с которой вы столкнулись. Поскольку наблюдается холодная видимость, последовательность заказов выполняется дважды (и состояния не разделяются между всеми подписками, выполняемыми оператором zip)

Во-первых, код можно упростить, чтобы его было легче понять. Вы можете удалить вызовы метода .toList() при выполнении команды Observable.from, которая «сгладит» ваш список.

bookingsSubscription = api.bookings() 
       .flatMap(coldBookings -> { 
        ConnectableObservable bookings = coldBooking.publish(); 
        Observable zip = Observable.zip(
         bookings.flatMap(booking -> api.order(booking.orderId)), 
         bookings, 
         (newBooking, oldBooking) -> { 
          // ... 
        }); 
        bookings.connect(); 
        return zip.toList(); 
       }) 
       .subscribe(callback); 

Что я сделал: удалить бесполезно Observable.from(obs.toList()) и использовать непосредственно наблюдаемой. Преобразование холода наблюдаема горячей наблюдаемым с использованием publish/connect методов

Вы можете получить более подробную информацию о горячей/холодной наблюдаемым здесь: http://www.introtorx.com/content/v1.0.10621.0/14_HotAndColdObservables.html

3

concatMap будет работать но не даст параллелизма, который вы хотите. concatMapEager с другой стороны будет.

Аналогичным вариантом является создание List<Observable> вручную и использование Observable.zip(Iterable, FuncN) для объединения списка. Это будет иметь тот же эффект, что и concatMapEager.

См. RxJava issue 3017 для обсуждения.

Смежные вопросы