// 优化代码内容
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 方法将文件大小按来源分类。
  • 使用 mappingreducing 方法累加每个来源的文件大小。
  • 使用 forEach 方法遍历分类后的结果,计算每个来源的占比。
  • 使用 Arrays.streamfilter 方法找到没有统计到的来源,并添加到结果列表中。

通过使用 Stream API 和 Collectors,代码结构更加简洁,可读性更高,也更易于维护。

Java代码优化:计算文件大小并按来源分类

原文地址: https://www.cveoy.top/t/topic/mwMk 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录