Java Steam过滤指定值分组并计算对应平均值

List<SfProjectMassifInfo> massifInfos  
    
  // 定义需要过滤的土地类型
        Set<String> targetYsdls = new HashSet<>(Arrays.asList("旱地", "水浇地"));
        Map<String, Double> averageDbByYsdl = massifInfos.stream()
                .filter(info -> isValidYsdl(info.getYsdl(), targetYsdls)) // 过滤指定且有效的土地类型
                .filter(info -> isValidDb(info.getDb())) // 确保db
                .collect(Collectors.groupingBy(
                        SfProjectMassifInfo::getYsdl, // 按土地类型分组
                        Collectors.averagingDouble(info ->
                                parseDoubleOrDefault(info.getDb().trim(), 0.0) // 将字符串转换为double并计算平均值
                        )
                ));
        sfProjectBaseInfo.setDryLandLevel(BigDecimal.valueOf(averageDbByYsdl.get("旱地")));


 /**
     * 获取字段值不为空且符合类型的值
     *
     * @author 梁偉浩
     * @date 2024-12-06 11:39
     * @param ysdl
     * @param targetYsdls
     * @return boolean
     */
    private static boolean isValidYsdl(String ysdl, Set<String> targetYsdls) {
        return ysdl != null && !ysdl.trim().isEmpty() && targetYsdls.contains(ysdl.trim());
    }

    /**
     * 判断数据值是否不为空且是可解析数字类型
     * 
     * @author 梁偉浩
     * @date 2024-12-06 10:33
     * @param db
     * @return boolean
     */
    private static boolean isValidDb(String db) {
        try {
            if (db == null || db.trim().isEmpty()) {
                return false;
            }
            // 测试是否可以解析为数字
            Double.parseDouble(db.trim());
            return true;
        } catch (NumberFormatException e) {
            return false;
        }
    }

    /**
     * 将字符串转换为double,如果为空就设置默认值0.0
     * 
     * @author 梁偉浩
     * @date 2024-12-06 10:45
     * @param value
     * @param defaultValue
     * @return double
     */
    private static double parseDoubleOrDefault(String value, double defaultValue) {
        try {
            return Double.parseDouble(value);
        } catch (NumberFormatException e) {
            return defaultValue;
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java中的战斗机

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值