目录
- 1 需求
- 2 实现
1 需求
现在从数据库查询出一个list 集合的数据,是一个实体类,现在需要根据多个字段进行分组,最后只是返回一个map 集合。
一层一层的
2 实现
如果你想在最后一层的列表数据上进行计算,并将计算结果保存并返回一个Map
集合,可以按照以下方式修改代码:
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
方法中传递该变量。修改后的代码如下所示:
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