这段代码用于计算 ComputeResultExportDTO 对象列表中每个评分项的平均值。

以下是计算平均值的更新代码:

public static Map<String, BigDecimal> getAvgMap(final List<ComputeResultExportDTO> computeResultExportDTOS,
                                                final BigDecimal totality) {
    return CollectionUtils.emptyIfNull(computeResultExportDTOS)
        .stream()
        .filter(Objects::nonNull)
        .collect(Collectors.groupingBy(ComputeResultExportDTO::getScoreItemId,
            Collectors.mapping(ComputeResultExportDTO::getAssessScore, Collectors.toList())))
        .entrySet()
        .stream()
        .collect(Collectors.toMap(
            Map.Entry::getKey,
            e -> e.getValue().stream()
                .reduce(BigDecimal.ZERO, BigDecimal::add)
                .divide(new BigDecimal(e.getValue().size()), 2, RoundingMode.HALF_UP)
        ));
}

更改说明:

  1. 我们使用 Collectors.mapping 而不是 Collectors.reducing 来为每个评分项创建一个 assessScore 值列表。
  2. 然后,我们使用 entrySet() 将映射转换为键值对流。
  3. 对于每个键值对,我们通过使用 reduceassessScore 值列表减少为它们的总和来计算平均值,然后使用 divide 将总和除以列表的大小。
  4. 结果使用 Collectors.toMap 收集到一个新映射中,其中键是评分项,值是平均分数。

请注意,平均分数使用 RoundingMode.HALF_UP 舍入到小数点后两位。您可以根据您的要求调整舍入模式。

Java 代码计算评分项平均值 - 使用 Stream 和 Collectors

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

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