【发布时间】:2023-11-30 04:16:02
【问题描述】:
就是这样。真的找不到更接近的东西。我想实现以下任务链
List<Item> items = Collections.singletonList(new Item("John Smith", "1997-2014"));
Stream<CompletableFuture<List<ScrappingResult>>> scrappingFutures =
items.stream().map(item ->
CompletableFuture.supplyAsync(() -> new ScrappingTask(item).call()));
Stream<CompletableFuture<ScrappingResult>> scrappingFuturesUnwrapped =
scrappingFutures.map(resultsFuture -> ???);
Stream<CompletableFuture<TrimmingResult>> trimmingResults = scrappingFuturesUnwrapped.map(resultFuture ->
// thenCompose?
resultFuture.thenCompose(result -> {
Path clipsDir = Paths.get("./"
+ result.getItem().getName()
+ "/" + result.getItem().getTimespan());
AtomicInteger clipIdx = new AtomicInteger();
return result.getVideo().getClips().stream()
.map(clip -> CompletableFuture.supplyAsync(() ->
new TrimmingTask(
ffmpegPath,
result.getVideo().getVideoUrl(),
clip,
clipsDir.resolve("clip_" + clipIdx.incrementAndGet() + ".mp3")).call())
);
});
);
最后一行在语法上不正确,但我希望能传达这个想法。所以,我想做两次 flatMap 之类的事情,最后得到
Stream<CompletableFuture<TrimmingResult>>。
我该怎么做?
谢谢。
【问题讨论】:
-
使用实际代码会使问题更清晰。
-
@assylias 添加了代码。
-
您的代码与您在问题标题中写的不匹配。你的代码中没有
CompletableFuture<Stream<T>>。 -
除了标题不匹配之外,您为什么坚持通过执行 两个这些转换来使代码复杂化?
标签: java java-8 completable-future