[英]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. 如果HotelInfo
为null
,我想从列表中删除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.