[英]Java collections reduction into a Map
我有一個Map
對象列表,看起來像這樣:
year => 2016,
month => 10,
day => 11,
count => 123
我每天都有一個介於startDate
< endDate
范圍內的元素。
我希望能夠根據startDate
和endDate
之間的間隔將這些元素簡化為不同的時間分組。 如果startDate
和endDate
之間的差異大於4年,我想將它們分組為年份。 如果差異小於四年,但大於一年,我想將它們分為幾個月。 如果少於一年但大於一個月,我想分成幾周。 少於一個月的時間,無需分組。
當我說“組”時,我的意思是我想總結屬於特定年份的所有事物的count
元素(使用上面的第一個示例),並為每年返回一張如下圖:
year => 2016,
month => 1
day => 1
count => 9897
我知道必須有一種優雅的方法來完成此任務,但我很難將自己的大腦圍繞邏輯。
我不明白,您可以簡單地做到:
if(starDate is smaller then endDate by 4 year) {
resultMap = yourList.stream()
.collect(Collectors.groupingBy(map.get("year"),
Collectors.summingInt(map.get("count")));
}
else if(starDate is... another condition) {
resultMap = yourList.stream()
.collect(Collectors.groupingBy(map.get("month"),
Collectors.summingInt(map.get("count")));
}
// all the there cases...
以后將此結果映射到您想要的任何內容。
只需照常使用Collectors.groupingBy
並提供所需的分類器即可。
final LocalDate endDate = dateCounts.last().getDate();
Function<DateCount, LocalDate> mapLocalDate = dc-> {
LocalDate ld = dc.getDate();
long m = Period.between(ld, endDate ).toTotalMonths();
if ( m > 4*12 ) {
return ld.withMonth(1).withDayOfMonth(1);
} else if ( m >= 1 ) {
return ld.withDayOfMonth(1);
} else {
return ld;
}
};
Map<LocalDate, Long> r = dateCounts.stream()
.collect(Collectors.groupingBy(
mapLocalDate,
TreeMap::new,
Collectors.summingLong(DateCount::getCount)
)
);
System.out.println( "EndDate = " + endDate );
System.out.println( r );
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.