转换期货的流利语法

时间:2017-05-17 09:16:13

标签: java java-8 guava future

我正在使用Guava Futures将未来的调用链接在一起。特别是我使用的是Futures.transform(...)Futures.transformAsync(...)的组合,但结果代码实际上并不是非常易读。有没有办法以更“流利”的方式表达同样的事情?

2 个答案:

答案 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),
  • 使用此类方法编写您自己的包装器(例如,基于CompletableFuturefluent-futures API),
  • 坚持使用Guava 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);