如果是ifment,则为CompletableFuture

时间:2018-03-19 15:57:33

标签: java-8 completable-future

我有2个CompletableFutures和3个方法,它们必须一个接一个地发生。 但是,在某些情况下,第二种方法不是必需的。

        CompletableFuture<Boolean> cf1 = supplyASync.(() ->( doSomething1()));

        CompletableFuture<Boolean> cf2 = new CompletableFuture<Boolean>();
        if(someThing){
            cf2 = cf1.thenApplyAsync(previousResult -> doSomething2()); 
        }
        else{
            cf2 = cf1;
        }

        if (SomeThing2) {       
            cf2.thenApplyAsync(previousResult ->doSomeThing3());

        }

Bassicly我要做的是doSomething2将在doSomething1(如果需要)之后运行,但无论如何doSomeThing3将在第一个或两个之后执行。

  1. 这是正确的方法吗?或者有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

代码正在按顺序执行,即第一个可完成的未来1,然后是未来2(如果适用),最后是任务3。

因此,您可以使用单个CompletableFuture:

CompletableFuture<Boolean> cf = CompletableFuture.supplyAsync(() -> {
    if (doSomething1()) {
        doSomething2();
    }
    doSomething3();
    // return something
});

处理布尔结果将类似于:

CompletableFuture<Boolean> cf = CompletableFuture.supplyAsync(() -> {
    boolean result;
    if (result = doSomething1()) {
        result = doSomething2();
    }
    return result && doSomething3();
});
// handle future as you need, e.g. cf.get() to wait the future to end (after task 3)