繁体   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