RxJava:在Observable中过滤List(在适当的位置)



我想调用一个检索酒店列表的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());

相关内容

最新更新