java - Set<Future<Object>> 中满足谓词的第一个对象

标签 java functional-programming java-8 future rx-java

抽象思想

我想从一组 Futures 中获取满足给定谓词的第一个值。

如果找到令人满意的值,则应取消所有其他 future 。如果在所有 Future 返回后仍未找到任何值,则应终止执行(通过返回默认值或抛出异常)。

具体例子

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/

相关文章:

java - 如何使用 Rserve 从 Java 中的 R 脚本导出数据?

f# - 将选项类型列表压缩为仅非无元素的最佳方法?

javascript - Ramda.js:要列出的参数

types - 如何在agda中通过W类型进行编码?

arrays - 使用 java 流更新字符串数组

java - 无法在Java中将字符串转换为日期,转换后时区错误

Java - 创建类的数组时将参数传递给类构造函数

java - 如何控制客户端库中的日志记录级别?

java - 后缀和 openJDK 11 : "No appropriate protocol (protocol is disabled or cipher suites are inappropriate)"

java - 为什么不用导入就可以使用Predicate参数?