Se o seu Futurefor o resultado de uma chamada a um ExecutorServicemétodo (por exemplo submit()), o mais fácil seria usar o CompletableFuture.runAsync(Runnable, Executor)método.
De
Runnbale myTask = ... ;
Future<?> future = myExecutor.submit(myTask);
para
Runnbale myTask = ... ;
CompletableFuture<?> future = CompletableFuture.runAsync(myTask, myExecutor);
O CompletableFutureé então criado "nativamente".
EDIT: Seguindo comentários de @SamMefford corrigidos por @MartinAndersson, se você quiser passar um Callable, você precisa chamar supplyAsync(), convertendo o Callable<T>em um Supplier<T>, por exemplo, com:
CompletableFuture.supplyAsync(() -> {
try { return myCallable.call(); }
catch (Exception ex) { throw new RuntimeException(ex); } // Or return default value
}, myExecutor);
Como T Callable.call() throws Exception;lança uma exceção e T Supplier.get();não, você precisa capturar a exceção para que os protótipos sejam compatíveis.