Ahm*_*lah 2 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);
}
}
Run Code Online (Sandbox Code Playgroud)
以下语句可用于以异步方式运行该方法。
final CompletableFuture<String> jokeAsync = CompletableFuture.supplyAsync(() -> getChuckNorrisJoke());
Run Code Online (Sandbox Code Playgroud)
尽管我认为我理解CompletionStage与 的关系CompletableFuture,但我不确定如何使用它CompletionStage来完成相同的任务。
final CompletionStage<String> jokeAsync = ?
Run Code Online (Sandbox Code Playgroud)
另外,我不确定“组合阶段”
CompletionStage是由 实现的接口CompletableFuture,因此您只需声明jokeAsync为 aCompletionStage即可工作:
final CompletionStage<String> jokeAsync = CompletableFuture.supplyAsync(() -> getChuckNorrisJoke());
Run Code Online (Sandbox Code Playgroud)
如果您有多个阶段,您可以以不同的方式组合它们,例如:
thenCombine()合并两个阶段的结果applyToEither()处理第一个完成的结果并返回包含结果的新阶段acceptEither()消耗任一结果而不返回新结果runAfterBoth()并runAfterEither()在两个或任一阶段完成后运行操作。该CompletionStageAPI 不提供某些仅由 提供的操作CompletableFuture:
supplyAsync()allOf()和结合起来anyOf()join()使用或等待阶段结果get()但它toCompletableFuture()允许转换任何阶段,从而弥补差距。
| 归档时间: |
|
| 查看次数: |
4410 次 |
| 最近记录: |