简体   繁体   English

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

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

I want to call an API that retrieves a list of hotels. 我想调用一个API来检索酒店列表。 The response comes back as an Observable<Response> . 响应以Observable<Response> Within the Response object there is a List<HotelAvailability> , and within the HotelAvailability object, there is HotelInfo object. Response对象中有一个List<HotelAvailability> ,在HotelAvailability对象中有HotelInfo对象。 If HotelInfo is null , I want to remove the HotelAvailability from the list. 如果HotelInfonull ,我想从列表中删除HotelAvailability I have got halfway with Rx, and then had to default back to a plain-old iterator and while loop. 我已经中途使用Rx了,然后不得不默认回到一个普通的迭代器和while循环。 Can anyone help me make this entirely RX? 任何人都可以帮我完全RX吗? (Note: I am coding on Android and for a relatively low SDK, so JDK8 solutions won't work for me). (注意:我在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());

You can flatMap your list so you get separate stream events so you can filter them out one by one and then you can aggregate them back into a single list. 您可以对列表进行flatMap,以便获得单独的流事件,以便逐个过滤它们,然后将它们聚合回单个列表。

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

If you want you can even flatMap the list from one single call: 如果您愿意,您甚至可以通过一次调用对该列表进行flatMap:

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

Just use the JDK8 API: 只需使用JDK8 API:

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

Edit: Doing it completely in RxJava, but maybe not necessarily better: 编辑:在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