簡體   English   中英

將Java集合簡化為Map

[英]Java collections reduction into a Map

我有一個Map對象列表,看起來像這樣:

year  => 2016,
month => 10,
day   => 11,
count => 123

我每天都有一個介於startDate < endDate范圍內的元素。

我希望能夠根據startDateendDate之間的間隔將這些元素簡化為不同的時間分組。 如果startDateendDate之間的差異大於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM