前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一个list 里面存放实体类,根据多个字段进行分组,最后将结果都保存,返回一个map 集合,一层一层的map 集合

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

作者头像
一写代码就开心
发布2024-01-04 08:23:13
3620
发布2024-01-04 08:23:13
举报
文章被收录于专栏:java和python
目录
  • 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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-01-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 目录
  • 1 需求
  • 2 实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档