需求:數據表含字段 (日期、資產名稱、數量、金額、學校),按年份分組統計每學校每年資產總數量、總金額。
class Record {
private String dateStr; // "2015-01-01"
private String schoolName;
private int money;
// getter...
public String getYear() { return dateStr.split("-")[0]; }
}
public Map> tongJi(List list) {
Map> result = new HashMap<>();
for (Record rd : list) {
String year = rd.getYear();
String school = rd.getSchoolName();
int money = rd.getMoney();
// 獲取或創建年份 Map
Map schoolMap = result.computeIfAbsent(year, k -> new HashMap<>());
// 累加學校金額
schoolMap.merge(school, money, Integer::sum);
}
return result;
}
computeIfAbsent (JDK 8+) 簡化「不存在則創建」邏輯。merge 簡化「累加或初始化」邏輯。
public void print(Map> map) {
for (Map.Entry> yearEntry : map.entrySet()) {
for (Map.Entry schoolEntry : yearEntry.getValue().entrySet()) {
System.out.printf("Year: %s, School: %s, Total: %d%n",
yearEntry.getKey(), schoolEntry.getKey(), schoolEntry.getValue());
}
}
}
SELECT YEAR(date_col) AS yr, school_name, SUM(money) AS total_money, COUNT(*) AS total_count
FROM assets
GROUP BY YEAR(date_col), school_name
ORDER BY yr, school_name;
將內層 Map 改為 Map,Stats 含 count, totalMoney, totalQuantity 等字段,merge 時累加各字段。
採用 JDK 8 Map 新方法編寫簡潔、高效的分組聚合邏輯,或下推至 SQL 層最大化性能。