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;
        }
    }
Java 中,可以利用 Stream 的 `filter` 方法从 `List` 里获取定值对应的 `List`。以下为具体示例: ```java import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; public class StreamFilterExample { public static void main(String[] args) { // 创建一个包含多个字符串的列表 List<String> stringList = new ArrayList<>(); stringList.add("name1"); stringList.add("name2"); stringList.add("name3"); stringList.add("name1"); stringList.add("name4"); // 要查找的定值 String targetValue = "name1"; // 使用 Stream 的 filter 方法筛选出包含定值的元素 List<String> filteredList = stringList.stream() .filter(data -> data.equals(targetValue)) .collect(Collectors.toList()); // 输出筛选后的列表 System.out.println(filteredList); } } ``` 在上述代码里,`stringList.stream()` 把 `List` 转换为流,`filter(data -> data.equals(targetValue))` 筛选出与定值 `targetValue` 相等的元素,最后用 `collect(Collectors.toList())` 把筛选结果收集到一个新的 `List` 中。 如果 `List` 存储的是自定义对象,想要根据对象的某个属性筛选,可按如下方式操作: ```java import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; class User { private String name; private int age; public User(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } } public class StreamFilterObjectExample { public static void main(String[] args) { // 创建一个包含多个 User 对象的列表 List<User> userList = new ArrayList<>(); userList.add(new User("Alice", 20)); userList.add(new User("Bob", 25)); userList.add(new User("Alice", 30)); // 要查找的定值 String targetName = "Alice"; // 使用 Stream 的 filter 方法筛选出包含定值的元素 List<User> filteredUserList = userList.stream() .filter(user -> user.getName().equals(targetName)) .collect(Collectors.toList()); // 输出筛选后的列表 for (User user : filteredUserList) { System.out.println(user.getName() + ": " + user.getAge()); } } } ``` 在这个例子中,`userList.stream()` 将 `List` 转换为流,`filter(user -> user.getName().equals(targetName))` 筛选出 `name` 属性和定值 `targetName` 相等的 `User` 对象,最后用 `collect(Collectors.toList())` 把筛选结果收集到一个新的 `List` 中 [^3][^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Java中的战斗机

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

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

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

打赏作者

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

抵扣说明:

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

余额充值