如何将含值列表的Map转换为存储平均值的Map<String, Double>?
更简洁的Map平均值转换实现方式
你可以利用Java Stream的Collectors.toMap()直接完成转换,无需手动初始化HashMap并逐个put,代码更紧凑且更符合函数式编程风格:
Map<String, List<Float>> scoresMap = Map.of( "Prod1", List.of(2f, 2f, 2f, 2f), "Prod2", List.of(4f, 4f, 4f, 4f), "Prod3", List.of(6f, 6f, 6f, 6f), "Prod4", List.of(8f, 8f, 8f, 8f)); Map<String, Double> averageScores = scoresMap.entrySet().stream() .collect(Collectors.toMap( Map.Entry::getKey, entry -> entry.getValue().stream() .mapToDouble(Float::doubleValue) .average() .orElse(0.0) // 处理空列表场景,避免抛出NoSuchElementException ));
优化点说明
- 链式调用替代手动循环,代码结构更简洁,减少冗余操作
- 使用方法引用
Float::doubleValue替代lambda表达式d -> d,可读性更强 - 新增
orElse(0.0)兜底逻辑,避免原代码中getAsDouble()在列表为空时抛出异常,提升代码鲁棒性
如果能确保所有列表都非空,也可以保留getAsDouble(),但建议保留兜底逻辑以应对边界情况。
内容的提问来源于stack exchange,提问作者Punter Vicky
相关产品推荐
相关产品推荐

