我想將每日銷售額(無論如何,沒關系)的串列轉換為每月銷售額的串列。
所以我有一個List<Map<String, Object>> perDay,其中包含這些日常值:
[{DATE=2022-01-01, COUNT=5}, {DATE=2022-01-02, COUNT=3}, {DATE=2022-02-29, COUNT=4}]
這些值應收集到每月值中,如下所示:
[{DATE=2022-01, COUNT=8}, {DATE=2022-02, COUNT=4}]
我想對流使用groupingBy()方法。
這是我的代碼:
List<Map<String, Object>> perDay = new ArrayList<>();
Map<String, Object> jan1 = new HashMap<>();
jan1.put("DATE", "2022-01-01"); jan1.put("COUNT", "5");
Map<String, Object> jan2 = new HashMap<>();
jan2.put("DATE", "2022-01-02"); jan2.put("COUNT", "3");
Map<String, Object> feb1 = new HashMap<>();
feb1.put("DATE", "2022-02-29"); feb1.put("COUNT", "4");
Map<String, Object> perMonth = perDay.stream()
.collect(Collectors.groupingBy("???",
Collectors.summingInt(f -> Integer.parseInt((String) f))));
我想,我已經接近了,但我還沒有完全到那里。
有任何想法嗎?
uj5u.com熱心網友回復:
假設您的日期始終采用格式
2022-01-01
你可以試試:
var map = perDay.stream().collect(
Collectors.groupingBy(monthMap -> ((String) monthMap.get("DATE")).substring(0, 7),
Collectors.summingInt(monthMap -> Integer.parseInt(String.valueOf(monthMap.get("COUNT"))))));
回報:
{2022-01=8, 2022-02=4}
uj5u.com熱心網友回復:
您介紹的方法是不可維護的,因此容易出現錯誤和代碼重復,并且也使代碼的擴展更加困難。
這些是主要問題:
不要
Object用作泛型型別。因為沒有強制轉換的型別的集合元素Object一文不值。如果您無意撰寫充滿強制轉換和intanceof檢查的混亂代碼,請不要這樣做。Map-與 JSON 物件不同(我不是在談論 Gson 等 Java 庫中的類,它們是基于映射的),不要將構建人類可讀文本的方法與實作混淆資料結構。像
"DATE"和的鍵"COUNT"是沒用的——你可以簡單地存盤實際的日期和計數。用作
String數字和日期的型別不會給您帶來任何優勢。如果不進行決議,您將無法使用它們(除了在控制臺上比較和列印),幾乎就像使用Object. 為每個元素使用適當的資料型別。為什么?因為LocalDate,Integer,YearMonth有自己獨特的行為String不能提供給你。
這就是您可以通過將代表每天銷售額 List<Map<String, Object>>的集合調整為Map<LocalDate, Integer>更方便的方式來改進代碼的方法:
Map<LocalDate, Integer> salesPerDay = perDay.stream()
.map(map -> Map.entry(LocalDate.parse((String) map.get("DATE"), DateTimeFormatter.ISO_DATE),
Integer.parseInt((String) map.get("COUNT"))))
.collect(Collectors.groupingBy(
Map.Entry::getKey,
Collectors.summingInt(Map.Entry::getValue)));
這就是您可以從中生成包含每月銷售額的地圖的方法(YearMonth從java.time包中用作鍵):
Map<YearMonth, Integer> salesPerMonth = salesPerDay.entrySet().stream()
.collect(Collectors.groupingBy(
entry -> YearMonth.from(entry.getKey()),
Collectors.summingInt(Map.Entry::getValue)));
salesPerMonth.forEach((k, v) -> System.out.println(k " -> " v));
輸出:
2022-01 -> 8
2022-02 -> 4
在線演示的鏈接
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/483656.html
上一篇:洗掉字串中-前后的空格
