Java 代码优化:高效计算分数子项总分

本文将介绍一种高效的 Java 代码优化方法,用于计算分数子项的总分。假设我们有一个包含多个分数子项的列表,每个子项都包含其权重、得分和 ID。我们需要计算每个 ID 对应的所有子项的总分。

优化前的代码:

public Map<String, BigDecimal> getLevelSubtotal(final List<ScoreItemTableSourceVO> scoreItems) {
    return CollectionUtils.emptyIfNull(scoreItems)
        .stream()
        .flatMap(item -> item.getScoreList().stream())
        .map(item -> convert(item, scoreItems.size()))
        .collect(Collectors.groupingBy(LevelSubtotalVO::getScoreItemId,
            Collectors.reducing(BigDecimal.ZERO,
                LevelSubtotalVO::getLevelSubtotalScore,
                BigDecimal::add)));
}

private static LevelSubtotalVO convert(final ScoreItemValueVO scoreItemValue,
                                       final int size) {
    BigDecimal examineWeight = scoreItemValue.getExamineWeight();
    BigDecimal assessScore = NumberUtils.createBigDecimal(String.valueOf(scoreItemValue.getAssessScore()));
    final BigDecimal levelSubtotalAssessScore = examineWeight.multiply(assessScore)
        .divide(BigDecimal.valueOf(size), 4, RoundingMode.HALF_UP);
    LevelSubtotalVO levelSubtotalVO = new LevelSubtotalVO(scoreItemValue.getId(), levelSubtotalAssessScore);
    return levelSubtotalVO;
}

优化后的代码:

public Map<String, BigDecimal> getLevelSubtotal(final List<ScoreItemTableSourceVO> scoreItems) {
    final int size = CollectionUtils.size(scoreItems);
    return CollectionUtils.emptyIfNull(scoreItems)
        .stream()
        .map(ScoreItemTableSourceVO::getScoreList)
        .flatMap(Collection::stream)
        .map(item -> convert(item, size))
        .collect(Collectors.groupingBy(LevelSubtotalVO::getScoreItemId,
            Collectors.reducing(BigDecimal.ZERO,
                LevelSubtotalVO::getLevelSubtotalScore,
                BigDecimal::add)));
}

private static LevelSubtotalVO convert(final ScoreItemValueVO scoreItemValue,
                                           final int size) {
    final LevelSubtotalVO levelSubtotalVO = new LevelSubtotalVO();
    BigDecimal examineWeight = scoreItemValue.getExamineWeight();
    BigDecimal assessScore = NumberUtils.createBigDecimal(String.valueOf(scoreItemValue.getAssessScore()));
    BigDecimal sizeBigDecimal = BigDecimal.valueOf(size);
    final BigDecimal levelSubtotalAssessScore = examineWeight.multiply(assessScore)
        .divide(sizeBigDecimal, 4, RoundingMode.HALF_UP);
    levelSubtotalVO.setScoreItemId(scoreItemValue.getId());
    levelSubtotalVO.setLevelSubtotalScore(levelSubtotalAssessScore);
    return levelSubtotalVO;
}

优化思路:

  1. **避免重复计算:**在原代码中,scoreItems.size()convert 方法中被反复计算,造成性能损耗。优化后的代码将 scoreItems.size() 预先计算并存储在 size 变量中,避免重复计算。
  2. **减少中间对象:**原代码在 convert 方法中创建了一个新的 LevelSubtotalVO 对象,然后将该对象作为参数传递给 collect 方法。优化后的代码直接在 convert 方法中设置 LevelSubtotalVO 对象的属性,减少了中间对象创建和传递的开销。
  3. **使用更简洁的代码:**优化后的代码使用了更简洁的代码,例如使用 ScoreItemTableSourceVO::getScoreListCollection::stream 方法代替了 item.getScoreList().stream(),提高了代码的可读性和可维护性。

总结:

通过以上优化,代码的执行效率得到了提升,同时代码也更加简洁易懂。这体现了代码优化过程中关注性能和可读性之间的平衡。在实际开发中,我们需要根据具体情况选择合适的优化方案,以提升代码的整体质量。

注意:

本文中使用的 ScoreItemTableSourceVOLevelSubtotalVO 类是示例类,您可以根据自己的实际需求进行替换。

Java 代码优化:高效计算分数子项总分

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

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