一个list 里面存放实体类,根据多个字段进行分组,最后将结果都保存,返回一个map 集合,一层一层的map 集合

2024-01-04 08:23:13 浏览数 (2)

目录
  • 1 需求
  • 2 实现

1 需求

现在从数据库查询出一个list 集合的数据,是一个实体类,现在需要根据多个字段进行分组,最后只是返回一个map 集合。

一层一层的

2 实现

如果你想在最后一层的列表数据上进行计算,并将计算结果保存并返回一个Map集合,可以按照以下方式修改代码:

代码语言:javascript复制
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class GroupingExample {
    public static void main(String[] args) {
        List<ZpTimeIntervalJudge> dataList = getDataList(); // 获取数据列表
        
        // 按照等级、时效和模式分组,并计算值
        Map<String, Map<Integer, Map<String, Double>>> groupedData = dataList.stream()
                .collect(Collectors.groupingBy(ZpTimeIntervalJudge::getLevel,
                        Collectors.groupingBy(ZpTimeIntervalJudge::getTime,
                                Collectors.groupingBy(ZpTimeIntervalJudge::getMode,
                                        Collectors.collectingAndThen(Collectors.toList(), GroupingExample::calculateValue)))));
        
        // 打印分组结果
        groupedData.forEach((level, levelGroup) -> {
            System.out.println("等级:"   level);
            levelGroup.forEach((time, timeGroup) -> {
                System.out.println("时效:"   time);
                timeGroup.forEach((mode, value) -> {
                    System.out.println("模式:"   mode   ",计算值:"   value);
                });
            });
            System.out.println();
        });
    }
    
    // 根据最后一层的列表数据计算值的方法
    private static Double calculateValue(List<ZpTimeIntervalJudge> list) {
        // 根据实际需求进行计算,并返回结果
        // 示例:计算列表中所有数据的平均值
        double sum = 0.0;
        for (ZpTimeIntervalJudge data : list) {
            sum  = data.getValue();
        }
        return sum / list.size();
    }
    
    // 获取数据列表的示例方法,请根据实际情况进行实现
    private static List<ZpTimeIntervalJudge> getDataList() {
        // ...
    }
}

class ZpTimeIntervalJudge {
    private String level;
    private int time;
    private String mode;
    private double value;
    
    // 构造方法和getter/setter,请根据实际情况进行实现
    // ...
}

在修改后的代码中,我们使用Collectors.collectingAndThen方法来在最后一层分组的数据上进行计算。calculateValue方法接收一个最后一层的列表数据,并根据实际需求进行计算,并返回计算结果。这样,最终的分组结果将包含计算结果的Map集合。

如果在最后一层,需要传另外的参数

如果calculateValue方法需要接收一个最后一层的列表数据和一个额外的字符串变量,你可以将该变量添加到方法的参数列表中,并在Collectors.collectingAndThen方法中传递该变量。修改后的代码如下所示:

代码语言:javascript复制
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class GroupingExample {
    public static void main(String[] args) {
        List<ZpTimeIntervalJudge> dataList = getDataList(); // 获取数据列表
        
        // 按照等级、时效和模式分组,并计算值
        Map<String, Map<Integer, Map<String, Double>>> groupedData = dataList.stream()
                .collect(Collectors.groupingBy(ZpTimeIntervalJudge::getLevel,
                        Collectors.groupingBy(ZpTimeIntervalJudge::getTime,
                                Collectors.groupingBy(ZpTimeIntervalJudge::getMode,
                                        Collectors.collectingAndThen(Collectors.toList(),
                                                list -> calculateValue(list, "extraParameter"))))));
        
        // 打印分组结果
        groupedData.forEach((level, levelGroup) -> {
            System.out.println("等级:"   level);
            levelGroup.forEach((time, timeGroup) -> {
                System.out.println("时效:"   time);
                timeGroup.forEach((mode, value) -> {
                    System.out.println("模式:"   mode   ",计算值:"   value);
                });
            });
            System.out.println();
        });
    }
    
    // 根据最后一层的列表数据和额外参数计算值的方法
    private static Double calculateValue(List<ZpTimeIntervalJudge> list, String extraParameter) {
        // 根据实际需求进行计算,并返回结果
        // 示例:计算列表中所有数据的平均值,并使用额外参数进行计算
        double sum = 0.0;
        for (ZpTimeIntervalJudge data : list) {
            sum  = data.getValue();
        }
        return sum / list.size()   extraParameter.length(); // 示例中使用了额外参数的长度
    }
    
    // 获取数据列表的示例方法,请根据实际情况进行实现
    private static List<ZpTimeIntervalJudge> getDataList() {
        // ...
    }
}

class ZpTimeIntervalJudge {
    private String level;
    private int time;
    private String mode;
    private double value;
    
    // 构造方法和getter/setter,请根据实际情况进行实现
    // ...
}

在修改后的代码中,calculateValue方法的参数列表中添加了一个String类型的额外参数extraParameter。在Collectors.collectingAndThen

0 人点赞