我想调用一个检索酒店列表的API。响应返回为Observable<Response>
。在Response
对象中有一个List<HotelAvailability>
,在HotelAvailability
对象中有一个HotelInfo
对象。如果HotelInfo
是null
,我想从列表中删除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());