What is the correct way to create an already-completed CompletableFuture<Void>

允我心安 提交于 2019-12-30 07:59:10

问题


I am using Completable futures in java 8 and I want to write a method that, based on a received parameter, either runs multiple tasks with side effects in parallel and then return their "combined" future (using CompletableFuture.allOf()), or does nothing and returns an already-completed future.

However, allOf returns a CompletableFuture<Void>:

public static CompletableFuture<Void> allOf(CompletableFuture<?>... cfs)

And the only way to create an already-completed future that know is using completedFuture(), which expects a value:

public static <U> CompletableFuture<U> completedFuture(U value)

Returns a new CompletableFuture that is already completed with the given value.

and Void is uninstantiable, so I need another way to create an already-completed future of type CompletableFuture<Void>.

What is the best way to do this?


回答1:


Since Void can not be instantiated, you can only complete a CompletableFuture<Void> with a null result, which is exactly what you also will get when calling join() on the future returned by allOf() once it has been successfully completed.

So you can use

CompletableFuture<Void> cf = CompletableFuture.completedFuture(null);

to get such an already completed future.

But you can also use

CompletableFuture<Void> cf = CompletableFuture.allOf();

to denote that there are no jobs the result depends on. The result will be exactly the same.




回答2:


pass a null I guess:

CompletableFuture<Void> done = CompletableFuture.completedFuture(null);


来源:https://stackoverflow.com/questions/46641700/what-is-the-correct-way-to-create-an-already-completed-completablefuturevoid

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!