使用Java8 Stream流,将Map处理并转为不同键值对类型的Map

背景

当前有一个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返回结果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值