使用 CompletionStage 而不是 CompletableFuture

using CompletionStage instead of CompletableFuture

给定以下方法:

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 = ?

还有,我不确定"combining stages"

CompletionStage 是由 CompletableFuture 实现的接口,因此您只需将 jokeAsync 声明为 CompletionStage 即可:

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

如果你有几个阶段,你可以用不同的方式组合它们,比如:

CompletionStageAPI不提供一些只有CompletableFuture才提供的操作:

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

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