MediaData中有个duration属性, 通过stream()方法将List<File> listFile转化为List<MediaData>过程中, 如何异步地使用extractMetadata()方法设置duration属性
时间: 2024-05-15 18:19:25 浏览: 48
可以使用Java8的CompletableFuture来实现异步设置duration属性。
首先,需要将listFile转化为Stream<File>,然后使用map()方法将每个File转化为一个CompletableFuture<MediaData>。
在每个CompletableFuture中,使用supplyAsync()方法异步调用extractMetadata()方法来获取MediaData对象,并在获取完成后调用whenComplete()方法来设置duration属性。
最后,使用collect()方法将所有的CompletableFuture<MediaData>转化为List<MediaData>。
以下是示例代码:
```
List<MediaData> mediaDataList = listFile.stream()
.map(file -> CompletableFuture.supplyAsync(() -> {
MediaData mediaData = new MediaData();
mediaData.setFilePath(file.getPath());
try {
mediaData.extractMetadata();
} catch (Exception e) {
// handle exception
}
return mediaData;
}))
.map(completableFuture -> completableFuture.whenComplete((mediaData, throwable) -> {
if (throwable == null) {
mediaData.setDuration(mediaData.getMetadata().getDuration());
} else {
// handle exception
}
}))
.map(CompletableFuture::join)
.collect(Collectors.toList());
```
阅读全文