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