How to return a value using CompletableFuture

user2121 picture user2121 · May 23, 2015 · Viewed 8.9k times · Source

I created an example, i want to know how can I return a value using the CompletableFuture ? I also changed the CompletableFuture<Void> exeFutureList to be CompletableFuture<Integer> exeFutureList but eclipse always suggest to set it back to Void.

Please let me know how to return value using CompletableFuture.

Code:

    public class MainClass {

    static ExecutorService exe = null;
    static CompletableFuture<Void> exeFutureList = null;

    public static void main(String[] args) {
        exe = Executors.newFixedThreadPool(1);
        exeFutureList = CompletableFuture.runAsync(new RunClass(8), exe);
    }

    static class RunClass implements Runnable {

        private int num;

        public RunClass(int num) {
            // TODO Auto-generated constructor stub
            this.num = num;
        }

        public void run() {
            // TODO Auto-generated method stub
            this.num = this.num + 10;
        }

    }
}

Answer

Jean Logeart picture Jean Logeart · May 23, 2015

Runnable is just an interface with a run method that does not return anything.

Therefore the runAsync method that you are using returns a CompletableFuture<Void>

You need to submit a Supplier, using the supplyAsync method:

final int arg = 8;
CompletableFuture<Integer> f = CompletableFuture.supplyAsync(() -> {
    return arg + 10;
}, exe);

You can also create your own Supplier<Integer> implementation instead of using lambda.