listFile.stream().map((file -> { MediaData mediaData = new MediaFile(); mediaData.setFilePath(file.getPath()); mediaData.setFileName(file.getName()); mediaData.setType(CustomerModeActivity.MEDIA_TYPE_VIDEO); mediaData.setDuration(formatDuration(getMediaDuration(file.getPath()))); return mediaData; })).sorted(Comparator.comparing(MediaData::getFilePath)).collect(Collectors.toList());
时间: 2023-05-12 13:03:23 浏览: 106
这是一个 Java 8 中使用 Stream API 对文件列表进行操作的代码,将文件路径、文件名、媒体类型、媒体时长等信息封装到 MediaData 对象中,并按照文件路径进行排序,最终返回一个 MediaData 对象列表。
相关问题
/** * 导入数据 * * @param file 导入文件 */ @SaCheckPermission("system:enterpriseProduct:import") @PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public R<Void> importData(@RequestPart("file") MultipartFile file, String enterpriseId) throws Exception { // 校验乙方信息 EnterpriseInfoVo enterpriseInfoVo = iEnterpriseInfoService.queryById(enterpriseId); if (ObjectUtil.isNull(enterpriseInfoVo)) { throw new ServiceException("导入失败,乙方信息不存在!"); } List<SysDictData> sysDictDataList = iSysDictTypeService.selectDictDataByType("product_unit"); if (CollUtil.isEmpty(sysDictDataList)) { throw new ServiceException("导入失败,请先完善计量单位字典项!"); } Map<String, String> dictMap = sysDictDataList.stream().collect(Collectors.toMap(SysDictData::getDictLabel, SysDictData::getDictValue)); ExcelResult<TEnterpriseProductImportVo> result = ExcelUtil.importExcel(file.getInputStream(), TEnterpriseProductImportVo.class, new ProductImportListener(iTEnterpriseProductService, enterpriseId, dictMap)); return R.ok(result.getAnalysis()); }
这段代码是一个Java Spring Boot控制器的方法,用于导入数据。它使用了POST请求,并且通过请求参数`file`传入了一个MultipartFile对象,该对象包含要导入的文件数据。另外,还有一个字符串参数`enterpriseId`,表示乙方信息的ID。
在方法的开头,通过`@SaCheckPermission("system:enterpriseProduct:import")`注解进行权限检查。然后使用`@PostMapping`注解指定了请求路径为`/importData`,并且指定了请求的媒体类型为`MediaType.MULTIPART_FORM_DATA_VALUE`,表示接受multipart/form-data格式的请求。
接下来的代码逻辑中,首先根据`enterpriseId`查询乙方信息,如果乙方信息为空,则抛出一个自定义异常。然后通过调用`iSysDictTypeService.selectDictDataByType("product_unit")`方法查询计量单位字典数据,如果字典数据为空,则抛出另一个自定义异常。
接着,将查询到的字典数据转换为Map结构,其中字典项的`dictLabel`作为键,`dictValue`作为值。
最后,调用`ExcelUtil.importExcel()`方法将文件数据导入,并传入一个自定义的监听器对象`ProductImportListener`,该监听器会根据导入的数据进行处理。最后返回一个包含分析结果的R对象。
请注意,这是一个简化的代码片段,并且涉及到了一些自定义的类和方法。如果想要完整运行该代码,需要确保相关的依赖和其他代码都已正确配置和实现。
MediaData中有个duration属性, 通过stream()方法将List<File> listFile转化为List<MediaData>过程中, 如何异步地使用extractMetadata()方法设置duration属性
可以使用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());
```
阅读全文