Guava CheckedFuture<X,Y> 映射到 CheckedFuture <Z,Y> 无阻塞
Guava CheckedFuture<X,Y> map to CheckedFuture <Z,Y> without blocking
我最近遇到了 Guava 及其异步 Future API。
我有一个方法的声明与下面的类似:
CheckedFuture<X, Y> update(final X entry)
在某些时候可能会调用具有以下签名的方法:
CheckedFuture<Boolean, Y> delete(final X entry)
我一直在寻找但没有找到的方法是将对 delete
的调用结果映射到 CheckedFuture<X, Y>
,这是 return 类型update
.
有没有人能够通过调用 delete(entry).checkedGet()
在不阻塞整个计算的情况下做到这一点?
感谢任何帮助。
注意: 我知道 Guava javadocs 建议避免使用 CheckedFutures,但 atm 这就是 API 的构建方式,重建它是不切实际的(不是意思我不期待它!:)
您可以使用Futures#transform
CheckedFuture<X, Y> update(final X entry) {
CheckedFuture<Boolean, Y> f = delete(entry);
ListenableFuture<X> tr = Futures.transform(f, (Function<Boolean, X>) input -> entry);
return Futures.makeChecked(tr, input -> (Y) input.getCause());
}
CheckedFuture<Boolean, Y> delete(final X entry) {
return Futures.immediateFailedCheckedFuture(new Y());
}
我最近遇到了 Guava 及其异步 Future API。
我有一个方法的声明与下面的类似:
CheckedFuture<X, Y> update(final X entry)
在某些时候可能会调用具有以下签名的方法:
CheckedFuture<Boolean, Y> delete(final X entry)
我一直在寻找但没有找到的方法是将对 delete
的调用结果映射到 CheckedFuture<X, Y>
,这是 return 类型update
.
有没有人能够通过调用 delete(entry).checkedGet()
在不阻塞整个计算的情况下做到这一点?
感谢任何帮助。
注意: 我知道 Guava javadocs 建议避免使用 CheckedFutures,但 atm 这就是 API 的构建方式,重建它是不切实际的(不是意思我不期待它!:)
您可以使用Futures#transform
CheckedFuture<X, Y> update(final X entry) {
CheckedFuture<Boolean, Y> f = delete(entry);
ListenableFuture<X> tr = Futures.transform(f, (Function<Boolean, X>) input -> entry);
return Futures.makeChecked(tr, input -> (Y) input.getCause());
}
CheckedFuture<Boolean, Y> delete(final X entry) {
return Futures.immediateFailedCheckedFuture(new Y());
}