[英]RxJava: Filtering a List in an Observable (in place)
我想調用一個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());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.