java - 如何异步运行两个方法,获取结果,在第三种方法中使用并从第三种方法返回结果
问题描述
我想实现这样的目标:异步运行两个方法,它们返回具有相同对象的列表。一旦两者都被执行,我就可以在代码中传递这两个结果,从而产生第三个函数。我读了很多关于 CompletableFuture 的文章,但有些东西不起作用。我想要实现的一个例子:
B getResults() {
List<A> a = new ArrayList<A>();
List<A> b = new ArrayList<A>();
List<A> results = new ArrayList<A>();
// 1/ Call two methods asynchronously to get results for the first and for the second
a = getFirstResults();
b = getSecondResulst();
// 2 / Use results a and b to populate results
results.addAll(a);
results.addAll(b);
B finalResults = new B <>();
// 3 / Populate finalResults
finalResults.setResults(results);
return finalResult;
}
解决方案
不是以前那样,CompletableFuture
而是在测试中我如何处理一个非常相似的场景:
@Test
void completable() throws Exception {
CompletableFuture<List<Integer>> taskA = CompletableFuture.supplyAsync(() -> {
try {
return resultsFromA();
} catch (InterruptedException e) {
e.printStackTrace();
return new ArrayList<>();
}
});
CompletableFuture<List<Integer>> taskB = CompletableFuture.supplyAsync(() -> {
try {
return resultsFromB();
} catch (InterruptedException e) {
e.printStackTrace();
return new ArrayList<>();
}
});
List<Integer> result = new ArrayList<>();
result = Stream.of(taskA, taskB).map(CompletableFuture::join).flatMap(List::stream).collect(Collectors.toList());
assertThat(result, is(Arrays.asList(1, 2, 3, 4, 5, 10, 20, 30, 40, 50)));
}
private static List<Integer> resultsFromA() throws InterruptedException {
Thread.sleep(4000);
return Arrays.asList(1, 2, 3, 4, 5);
}
private static List<Integer> resultsFromB() throws InterruptedException {
Thread.sleep(2000);
return Arrays.asList(10, 20, 30, 40, 50);
}
resultsFromA
andresultsFromB
应该匹配你的getFirstResults
and getSecondResulst
。我将它们包装在 a 中CompletableFuture
并将它们组合为流。匹配器和断言来自Hamcrest
.
推荐阅读
- android - 获取所有播放列表 URL Youtube
- java - 德语 Eszett "ß" 的 Java IDN 转换
- c# - 如何在 HTTPTrigger Azure Function 3.x 中获取操作 ID。附上图片
- c - 为什么某些整数的双重转换(浮点数并返回整数)不保持等于其原始数字,而有些则如此?
- ios - 如何以编程方式更改 Siri 快捷方式的自定义 Intent 上的 Title 属性?
- python - 如何修复:ImportError:无法导入名称 LiveSpeech?
- typescript - 如何在 NestJS 中设置仅 HTTP cookie
- c - 哪个是最标准的:strnlen 或 strnlen_s?
- jquery - jQuery 中是否有可用的分钟选择器?
- python - s[s].index 和 s.index 之间的区别,其中 s 是一个系列