給定一個TimeEntry對象列表,我想將它們分組爲Day和Hour對象。Collectors.grouping進入對象列表?
其中Day包含Hour對象的列表,Hour包含TimeEntry對象的列表,表示它所代表的小時。
日和小時還保留在各自列表中的TimeEntry持續時間的總和。如果可能的話,也可以將日期名稱設爲Day。 TimeEntry列表按「開始」進行排序。
public class TimeEntry {
private LocalDateTime start;
private Duration duration;
public Integer getDay() { return this.start.get(ChronoField.DAY_OF_MONTH); }
public Integer getHour() { return this.start.get(ChronoField.HOUR_OF_DAY); }
public String getDayName() {
return this.start.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.getDefault());
}
}
public class Day {
private Integer dayNr;
private String dayName;
private Duration sumOfHours;
private List<Hour> hours;
}
public class Hour {
private Integer hourNr;
private Duration sumOfEntries;
private List<TimeEntry> entries;
}
你如何用Java 8s的流做到這一點?
List<Day> days = timeEntries.stream().collect(Collectors.groupingBy(...?
樣品輸入:
List<TimeEntry> timeEntries = [{"2016-01-22 10:00", "5 minutes"},
{"2016-01-23 08:00", "7 minutes"} , {"2016-01-23 08:43", "3 minutes"}]
輸出示例:
[
{dayNr: 22, dayName: Friday, sumofEntries: 5 minutes
[{hourNr: 10, sumofEntries: 5 minutes},
[{"2016-01-22 10:00", "5 minutes"}]} ]},
{dayNr: 23, dayName: Saturday, sumofEntries: 10 minutes
[{hourNr: 8, sumofEntries: 10 minutes},
[{"2016-01-23 08:00", "7 minutes"},
{"2016-01-23 08:43", "3 minutes"} ]}
]
你不會得到一個'清單'除非你寫你的_own_收集器。你可以用核心庫做的最好的做法是在幾天內做一個'groupingBy',然後每天在幾個小時內爲'groupingBy'做一個'Map >>「。 –