Java代码优化:计算文件大小并按来源分类
// 优化代码内容
if (CollectionUtil.isNotEmpty(officeOssDataList)){
Map<String, BigDecimal> ossDataMap = officeOssDataList.stream()
.filter(officeOssData -> Objects.nonNull(officeOssData.getFileSize()))
.collect(Collectors.groupingBy(OfficeOssData::getSource,
Collectors.mapping(OfficeOssData::getFileSize, Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));
List<ServiceVO> list = new ArrayList<>();
ossDataMap.forEach((name, size) -> {
ServiceVO serviceVO = new ServiceVO();
String descName = getDescName(name);
serviceVO.setName(descName);
BigDecimal decimal = new BigDecimal(1024);
BigDecimal convertedSize = size.divide(decimal, 2, BigDecimal.ROUND_UP).divide(decimal, 2, BigDecimal.ROUND_UP);
serviceVO.setSize(convertedSize);
list.add(serviceVO);
});
BigDecimal totalSize = officeOssDataList.stream()
.filter(officeOssData -> Objects.nonNull(officeOssData.getFileSize()))
.map(OfficeOssData::getFileSize)
.reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal decimal = new BigDecimal(1024);
BigDecimal convertedTotalSize = totalSize.divide(decimal, 2, BigDecimal.ROUND_UP).divide(decimal, 2, BigDecimal.ROUND_UP);
list.forEach(serviceVO -> serviceVO.setPercentage(serviceVO.getSize().divide(convertedTotalSize, 2, BigDecimal.ROUND_HALF_UP)));
List<String> nameList = list.stream().map(ServiceVO::getName).collect(Collectors.toList());
Arrays.stream(OssSourceEnums.values())
.filter(ossSourceEnums -> !nameList.contains(ossSourceEnums.getDesc()))
.forEach(ossSourceEnums -> {
ServiceVO serviceVO = new ServiceVO();
serviceVO.setName(ossSourceEnums.getDesc());
serviceVO.setPercentage(BigDecimal.ZERO);
serviceVO.setSize(BigDecimal.ZERO);
list.add(serviceVO);
});
}
这段代码使用 Java 8 的 Stream API 和 Collectors 来计算文件大小并按来源分类。
- 使用
filter方法过滤掉文件大小为空的元素。 - 使用
groupingBy方法将文件大小按来源分类。 - 使用
mapping和reducing方法累加每个来源的文件大小。 - 使用
forEach方法遍历分类后的结果,计算每个来源的占比。 - 使用
Arrays.stream和filter方法找到没有统计到的来源,并添加到结果列表中。
通过使用 Stream API 和 Collectors,代码结构更加简洁,可读性更高,也更易于维护。
原文地址: https://www.cveoy.top/t/topic/mwMk 著作权归作者所有。请勿转载和采集!