背景
当前有一个Map类型:Map<Object,Integer>
,需要对其中Value数据进行计算,并转换成另外一种Map类型返回Map<Object,BigDecimal>
常规foreach方法实现
/**
* 统计抽出的各阶概率
* @param rollResultUnitList 需要验证的数组
* @return 结果Map
*/
public static Map<YysRoll, BigDecimal> checkLevelRate(List<RollResultUnit> rollResultUnitList) {
//生成结果
Map<YysRoll, Integer> checkRollMap = checkLevelNum(rollResultUnitList);
//初始化变量
BigDecimal total = BigDecimal.valueOf(rollResultUnitList.size());
//创建缓存数组
Map<YysRoll, BigDecimal> tempMap = new HashMap<>(checkRollMap.size());
//遍历并计算
for (Map.Entry<YysRoll, Integer> entry : checkRollMap.entrySet()
) {
tempMap.put(entry.getKey(),
BigDecimal
.valueOf(entry.getValue())
.divide(total, 4, RoundingMode.CEILING));
}
return tempMap;
}
Stream API实现
/**
* 统计抽出的各阶概率
* @param rollResultUnitList 需要验证的数组
* @return 结果Map
*/
public static Map<YysRoll, BigDecimal> checkLevelRate(List<RollResultUnit> rollResultUnitList) {
//生成结果
Map<YysRoll, Integer> checkRollMap = checkLevelNum(rollResultUnitList);
//初始化变量
BigDecimal total = BigDecimal.valueOf(rollResultUnitList.size());
//处理并返回
return checkRollMap.entrySet().stream()
.map(entry ->
new AbstractMap.SimpleEntry<>(
entry.getKey(),
BigDecimal
.valueOf(entry.getValue())
.divide(total, 4, RoundingMode.CEILING)
))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
}
- 可以看到Stream 可以略过缓存Map的创建,同时搭配lambda表达式,可以省略for中的变量声明(也可以通过java8中增加的.forEach)
- 因为流中只能返回一个类型的流,所以使用AbstractMap.SimpleEntry包装了一个Map.Entry,后面通过Collectors.toMap转为map返回结果