RxJava:过滤Observable中的列表(就地)

时间:2016-10-19 16:30:07

标签: java rx-java

我想调用一个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());

2 个答案:

答案 0 :(得分:1)

只需使用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());

答案 1 :(得分:1)

您可以对列表进行flatMap,以便获得单独的流事件,以便逐个过滤它们,然后将它们聚合回单个列表中。

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

如果您愿意,您甚至可以通过一次通话平面显示列表:

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