我正在使用Guava Futures将未来的调用链接在一起。特别是我使用的是Futures.transform(...)
和Futures.transformAsync(...)
的组合,但结果代码实际上并不是非常易读。有没有办法以更“流利”的方式表达同样的事情?
答案 0 :(得分:2)
@ChrisPovirk mentioned in a comment上个月,一个流利的包装很快就会出现在公共番石榴中,现在它已经在23.0-SNAPSHOT了。
新FluentFuture
类使用@Beta
进行注释,因此即使发布Guava 23.0,它仍可能会发生变化。
无论如何,如果你现在git clone
番石榴,你可以这样做:
ExecutorService executor = Executors.newFixedThreadPool(1);
// WARNING: based on UNRELEASED version, this is just to get a glimpse of the future... (Future... get it?) :o)
FluentFuture<String> f =
FluentFuture.from(immediateFuture("world"))
.transform(name -> "Hello " + name, directExecutor())
.transformAsync(input -> immediateFuture(input + "!"), executor);
System.out.println(f.get());
(令人惊讶的是,打印&#34; Hello world!&#34;)
答案 1 :(得分:1)
如果您正在寻找像JDK CompletableFuture
中那样链接的流畅方法:
completableFuture
.thenApply(f1)
.thenApplyAsync(f2, executor)
然后不,使用Guava的ListenableFuture
是不可能的,包裹transform
是可行的方法。 (也许在Google内部,他们有一些流畅的包装?编辑 - 你为Google工作,所以你知道;)
话虽如此,你可以:
ListenableFuture
(例如在this - rather niche - Github project called fluent-futures
中,但它使用旧的Guava&lt; 20 API),CompletableFuture
或fluent-futures
API),ListenableFuture
API时所做的事情),使用一些适配器并将ListenableFuture
转换为CompletableFuture
并使用其(流畅的)API - ex。 future-converter:
import static net.javacrumbs.futureconverter.java8guava.FutureConverter.*;
//...
ListenableFuture<String> guavaListenableFuture = toListenableFuture(completable);
//...
CompletableFuture<String> completable = toCompletableFuture(listenable);