情景:
考虑现有方法:
public <U> CompletionStage<U> thenApply(Function<? super T,? extends U> fn);
它不能完全满足我的需要,因为函数知道第一阶段结果值? super T
我更愿意拥有的是:
public <U> CompletionStage<U> thenApply(Supplier<? extends U> fn);
问题:我是否理解为没有开箱即用的解决方案,所以我必须编写自己的包装函数才能实现所需的行为?
答案 0 :(得分:2)
没有这样的内置解决方案。但你可能会滥用&#34; CompletableFuture.supplyAsync
和thenCompose
:
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中的参数。