gpt4 book ai didi

java - 如果原始 ApiFuture/ListenableFuture 失败或取消,什么是 Futures.transform() lambda 参数

转载 作者:行者123 更新时间:2023-11-30 07:44:00 26 4
gpt4 key购买 nike

我有一个异步发送消息列表的方法。每次发送返回ApiFuture<String> (Guava 的 GCP 版本 ListenableFuture )。我需要这个方法来返回一个 Future<Boolean> , 所以我

  1. 为每个 ApiFuture<String> 创建一个列表依赖项
  2. 转换结果 ApiFuture<List<String>>Future<Boolean>使用 ApiFutures.transform方法

ApiFuture< List < String > > allSentFuture = ApiFutures.allAsList(futures);
return ApiFutures.transform(allSentFuture, val -> {
return true;
},
Executors.newCachedThreadPool()
);

我的问题是:val 的值是多少?如果一个或多个原始 future 失败/取消,上述 lambda 的参数?在这种情况下甚至调用了 lambda 吗?

谢谢!

最佳答案

ApiFuture<V>V 类型上形成 monad , 和 transform将函数应用于 V 类型的封装值.如果ApiFuture<V>不包含 V值,因为失败或取消,则转换后的 future 是相同的。

如果要处理异常导致的失败,可以使用ApiFutures.catching()以产生替代结果(例如 Boolean.FALSE)。

如果你想把取消转化为成功的值(value),我相信你需要使用ApiFuture.addListener直接,让听众完成 SettableApiFuture你返回。然后监听器(当取消源 future 时将被调用)可以检查 isCancelled检测这种情况,或者可以捕获并处理 CancellationException .

例如:

/**
* Adapt an iterable of {@link ApiFuture} instances into a single {@code ApiFuture}.
*/
static <T> ApiFuture<Boolean> adaptFutures(Iterable<ApiFuture<T>> futures) {
final SettableApiFuture<Boolean> result = SettableApiFuture.create();
final ApiFuture<List<T>> allFutures = ApiFutures.allAsList(futures);
allFutures.addListener(
() -> {
if (allFutures.isCancelled()) {
result.set(Boolean.FALSE);
return;
}
try {
allFutures.get();
result.set(Boolean.TRUE);
} catch (ExecutionException | InterruptedException ex) {
// Maybe log something here?
//
// Note that InterruptedException is actually impossible here
// because we're running in the listener callback, but the API
// still marks it as potentially thrown by .get() above.
//
// So if we reach here it means that the allAsList future failed.
result.set(Boolean.FALSE);
}
},
// Not normally safe, but we know our listener runs fast enough
// to run inline on the thread that completes the last future.
Runnable::run);
return result;
}

关于java - 如果原始 ApiFuture/ListenableFuture 失败或取消,什么是 Futures.transform() lambda 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52872493/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com