有两种服务:
service1返回ids1的列表;
service2按id1返回ids2的列表:
如何使用completablefuture按id1->[id2,id2,id2,…]对结果进行分组?我想把它全部放到hashmap中,但我不知道如何将ids1传递到第二个未来。我在考虑使用thencombine(ids1future,(v1,v2)->{…}),但在我看来它相当难看。有什么“最佳实践”可以做到这一点吗?
这里不是异步方式:
Map<ID1, List<ID2>> idsMap = new HashMap();
List<IDS1> ids1List = service1.service.find();
for(ID1 id1: IDS1) {
List<IDS2> ids2List = service2.findById(id1);
idsMap.put(id1, ids2List);
}
service2.process(idsMap);
绑定异步执行:
CompletableFuture<List<IDS1>> ids1Future
= CompletableFuture.supplyAsync(() -> service.find());
ids1Future.thenApply((ids1) -> {
CompletableFuture<List<IDS2>> listFutureIds2 =
ids1.stream().map(id1 ->
CompletableFuture.supplyAsync(() ->
service2.getById(id1)))
.collect(Collectors.toList());
CompletableFuture<Void> allFuturesDone =
CompletableFuture.allOf(
listFutureIds2.toArray(
new
CompletableFuture[listFutureIds2.size()]));
allFuturesDone.thenApply(v ->
list.stream()
.map(CompletableFuture::join)
.collect(toList()));
});
2条答案
按热度按时间bz4sfanl1#
我希望我正确地理解了你的意思,所以这里是:
rkttyhzu2#
这是一个如何使用fork/join将字符列表转换为字符串列表的示例,其中每个字符串是字符的n倍的复制。你可以根据自己的情况调整这个例子。
我希望这就是你要找的。
结果是:
[aaaa, bbbb, cccc]