簡體   English   中英

RxJava:過濾Observable中的列表(就地)

[英]RxJava: Filtering a List in an Observable (in place)

我想調用一個API來檢索酒店列表。 響應以Observable<Response> Response對象中有一個List<HotelAvailability> ,在HotelAvailability對象中有HotelInfo對象。 如果HotelInfonull ,我想從列表中刪除HotelAvailability 我已經中途使用Rx了,然后不得不默認回到一個普通的迭代器和while循環。 任何人都可以幫我完全RX嗎? (注意:我在Android上編碼並且SDK的編程相對較低,因此JDK8解決方案對我不起作用)。

availabilityApi.getAvailability(hotelName)
            .doOnNext(response -> {
                Iterator<HotelAvailability> hotelAvailabilityIterator = availabilityResponse.hotelAvailabilities().iterator();
                while (hotelAvailabilityIterator.hasNext()) {
                    if (hotelAvailabilityIterator.next().hotelInfo() == null) {
                        hotelAvailabilityIterator.remove();
                    }
                }
            })
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread());

您可以對列表進行flatMap,以便獲得單獨的流事件,以便逐個過濾它們,然后將它們聚合回單個列表。

availabilityApi.getAvailability(hotelName)
        .map(Response::hotelAvailabilities)
        .flatMap(Observable::from)
        .filter(hotelAvailability -> hotelAvailability != null)
        .toList()
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread());

如果您願意,您甚至可以通過一次調用對該列表進行flatMap:

flatMap(response -> Observable.from(response.hotelAvailabilities()))

只需使用JDK8 API:

availabilityApi.getAvailability(hotelName)
        .doOnNext(availabilityResponse ->
           availabilityResponse.hotelAvailabilities().removeIf(
              availability -> availability.hotelInfo() == null
           )
        )
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread());

編輯:在RxJava中完全執行,但可能不一定更好:

availabilityApi.getAvailability(hotelName)
        .flatMap(response -> Observable
            .from(availabilityResponse.hotelAvailabilities())
            .filter(availability -> availability.hotelInfo() != null)
            .toList()
            .doOnNext(availabilityResponse::setHotelAvailabilities)
            .map(any -> response)
        )
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM