使用 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());
尽管我认为我理解 CompletionStage
与 CompletableFuture
的关系,但我不确定如何使用 CompletionStage
来完成相同的任务。
final CompletionStage<String> jokeAsync = ?
还有,我不确定"combining stages"
CompletionStage
是由 CompletableFuture
实现的接口,因此您只需将 jokeAsync
声明为 CompletionStage
即可:
final CompletionStage<String> jokeAsync = CompletableFuture.supplyAsync(() -> getChuckNorrisJoke());
如果你有几个阶段,你可以用不同的方式组合它们,比如:
thenCombine()
合并 2 个阶段的结果
applyToEither()
处理第一个完成的结果,return 一个新阶段的结果
acceptEither()
在没有 return 新结果的情况下使用任一结果
runAfterBoth()
and runAfterEither()
到 运行 两个或其中一个阶段完成后的操作。
CompletionStage
API不提供一些只有CompletableFuture
才提供的操作:
- 正在提交任务,例如
supplyAsync()
- 将多个阶段与
allOf()
和 anyOf()
组合
- 以编程方式完成阶段或创建已经完成的阶段
- 等待
join()
或 get()
阶段的结果
但是 toCompletableFuture()
允许转换任何阶段,从而弥合差距。
给定以下方法:
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());
尽管我认为我理解 CompletionStage
与 CompletableFuture
的关系,但我不确定如何使用 CompletionStage
来完成相同的任务。
final CompletionStage<String> jokeAsync = ?
还有,我不确定"combining stages"
CompletionStage
是由 CompletableFuture
实现的接口,因此您只需将 jokeAsync
声明为 CompletionStage
即可:
final CompletionStage<String> jokeAsync = CompletableFuture.supplyAsync(() -> getChuckNorrisJoke());
如果你有几个阶段,你可以用不同的方式组合它们,比如:
thenCombine()
合并 2 个阶段的结果applyToEither()
处理第一个完成的结果,return 一个新阶段的结果acceptEither()
在没有 return 新结果的情况下使用任一结果runAfterBoth()
andrunAfterEither()
到 运行 两个或其中一个阶段完成后的操作。
CompletionStage
API不提供一些只有CompletableFuture
才提供的操作:
- 正在提交任务,例如
supplyAsync()
- 将多个阶段与
allOf()
和anyOf()
组合
- 以编程方式完成阶段或创建已经完成的阶段
- 等待
join()
或get()
阶段的结果
但是 toCompletableFuture()
允许转换任何阶段,从而弥合差距。