使用CompletionStage而不是CompletableFuture

时间:2018-09-25 16:22:24

标签: java lambda completable-future completion-stage

使用以下方法:

private static String getChuckNorrisJoke () {
    try {
        HttpURLConnection con = (HttpURLConnection) new
        URL( "http://api.icndb.com/jokes/random" ).openConnection();
        BufferedReader in = new BufferedReader( new InputStreamReader(con.getInputStream()));
        StringBuilder response = new StringBuilder();
        String line;
        while ((line = in.readLine()) != null ) {
            response.append(line);
        }
        in.close();
        return response.toString();
    } catch (IOException e) {
        throw new IllegalStateException( "Something is wrong: " , e);
    }
}

以下语句可用于以异步方式运行该方法。

final CompletableFuture<String> jokeAsync = CompletableFuture.supplyAsync(() -> getChuckNorrisJoke());

尽管我认为我了解CompletionStageCompletableFuture的关系,但是我不确定如何使用CompletionStage完成相同的任务。

final CompletionStage<String> jokeAsync = ?

另外,我不确定“合并阶段”

1 个答案:

答案 0 :(得分:1)

CompletionStage是由CompletableFuture实现的接口,因此您只需将jokeAsync声明为CompletionStage,它将起作用:

final CompletionStage<String> jokeAsync = CompletableFuture.supplyAsync(() -> getChuckNorrisJoke());

如果您有多个阶段,则可以用不同的方式将它们组合在一起,例如:

CompletionStage API不提供某些仅由CompletableFuture提供的操作:

  • 提交任务,例如与supplyAsync()
  • 将多个阶段与allOf()anyOf()组合起来
  • 以编程方式完成阶段或创建已经完成的阶段
  • 等待join()get()的阶段结果

但是toCompletableFuture()允许转换任何阶段,从而缩小差距。