抽象概念
我想从满足给定谓词的一组 Future 中获取第一个值。
如果找到满意的值,则应取消所有其他 future 。如果在所有 Futures 返回后都没有找到值,则应终止执行(通过返回默认值或抛出异常)。
具体示例
public boolean isThereVacantHotelRooms(Set<URL> hotelApiUrls) {
// returns true if any provided server responds with a number larger than 0
}
我正在寻找一种在 Java 8 中实现上述内容的漂亮方法(外部库很好)。我试过用 CompletableFuture 和 RxJava 来实现它,但我都觉得这个问题很不习惯,我最终得到了很多丑陋的代码。
最佳答案
我认为,您的情况可以通过合并、过滤和采取的组合来完成:
List<Observable<HotelInfo>> hotels = new ArrayList<>();
for (URL u : urls) {
Observable<HotelInfo> hotelInfo = networkAPI.askHotel(u);
hotels.add(hotelInfo);
}
Observable.merge(hotels)
.filter(h -> h.vacancy > 0)
.take(1)
.subscribe(h -> System.out.println("Winner: " + h), Throwable::printStackTrace);
关于java - Set<Future<Object>> 中满足谓词的第一个对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30756503/