Java 代码优化:高效计算分数子项总分
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;
}
优化思路:
- **避免重复计算:**在原代码中,
scoreItems.size()在convert方法中被反复计算,造成性能损耗。优化后的代码将scoreItems.size()预先计算并存储在size变量中,避免重复计算。 - **减少中间对象:**原代码在
convert方法中创建了一个新的LevelSubtotalVO对象,然后将该对象作为参数传递给collect方法。优化后的代码直接在convert方法中设置LevelSubtotalVO对象的属性,减少了中间对象创建和传递的开销。 - **使用更简洁的代码:**优化后的代码使用了更简洁的代码,例如使用
ScoreItemTableSourceVO::getScoreList和Collection::stream方法代替了item.getScoreList().stream(),提高了代码的可读性和可维护性。
总结:
通过以上优化,代码的执行效率得到了提升,同时代码也更加简洁易懂。这体现了代码优化过程中关注性能和可读性之间的平衡。在实际开发中,我们需要根据具体情况选择合适的优化方案,以提升代码的整体质量。
注意:
本文中使用的 ScoreItemTableSourceVO 和 LevelSubtotalVO 类是示例类,您可以根据自己的实际需求进行替换。
原文地址: https://www.cveoy.top/t/topic/qA95 著作权归作者所有。请勿转载和采集!