当第二阶段对第一阶段结果值不感兴趣时​​,CompletionStage链接

时间:2016-11-03 20:40:07

标签: java concurrency java-8

情景

  • 有两个阶段
  • 第二阶段仅在第一阶段完成后执行
  • 第二阶段对第一阶段结果不感兴趣,而仅仅是第一阶段完成

考虑现有方法:

public <U> CompletionStage<U> thenApply(Function<? super T,? extends U> fn);

它不能完全满足我的需要,因为函数知道第一阶段结果值? super T

我更愿意拥有的是:

public <U> CompletionStage<U> thenApply(Supplier<? extends U> fn);

问题:我是否理解为没有开箱即用的解决方案,所以我必须编写自己的包装函数才能实现所需的行为?

2 个答案:

答案 0 :(得分:2)

没有这样的内置解决方案。但你可能会滥用&#34; CompletableFuture.supplyAsyncthenCompose

Supplier<String> sup = ()->"s";
CompletableFuture.supplyAsync(()->4)
        .thenCompose(x->CompletableFuture.supplyAsync(sup))
        .thenAccept(System.out::println);
BTW,我想可能没有这样的便利方法,因为CompletionStage / CompletableFuture已经有很多方法。

答案 1 :(得分:0)

如果你想要运行的东西不会返回结果,你可以使用thenRun

CompletableFuture<Thing> thingsFuture = CompletableFuture.supplyAsync(() -> getThings());
thingsFuture.thenRun(() -> System.out.println("Got ALL THE THINGS!"));

如果你需要它来返回结果,那么我恐怕你运气不好。你拥有的最佳选择就是忽略lambda中的参数。