Java组由一个包含2个LocalDateTime字段的对象列表组成,然后从中获得最大值和最小值



我得到了一个类调用TimeInterval,它有两个字段;startDate";以及";endDate";,我得到了这样一个数据列表:

在这里列出,还有更多,但我认为这些已经足够了

我想做的是,以前6个结果为例,它的开始日期为";2015-01-19":

此处列出示例

现在我想按startDate对它们进行分组;小时;startDate的值;12〃;,并且还取最大值"0";小时;endDate的值;4〃;。

我该如何做到这一点?我试着用stream分组,但我遇到了一个死胡同,不知道如何解决这个问题。

TimeInterval类:

public class TimeInterval {
private LocalDateTime startDate;
private LocalDateTime endDate;
public LocalDateTime getStartDate() {
return startDate;
}
public void setStartDate(LocalDateTime startDate) {
this.startDate = startDate;
}
public LocalDateTime getEndDate() {
return endDate;
}
public void setEndDate(LocalDateTime endDate) {
this.endDate = endDate;
}

public TimeInterval(LocalDateTime startDate, LocalDateTime endDate) {
this.startDate = startDate;
this.endDate = endDate;
}
@Override
public String toString() {
return "TimeInterval [startDate=" + startDate + ", endDate=" + endDate +"]";
}
}

数据:

TimeInterval [startDate=2015-01-19T12:00, endDate=2015-01-19T23:59:59]
TimeInterval [startDate=2015-01-19T13:00, endDate=2015-01-19T17:00]
TimeInterval [startDate=2015-01-19T15:30, endDate=2015-01-19T18:30]
TimeInterval [startDate=2015-01-19T17:00, endDate=2015-01-19T18:30]
TimeInterval [startDate=2015-01-19T18:00, endDate=2015-01-19T19:00]
TimeInterval [startDate=2015-01-19T19:00, endDate=2015-01-20T04:00]
TimeInterval [startDate=2015-01-20T06:00, endDate=2015-01-20T21:00]
TimeInterval [startDate=2015-01-20T07:00, endDate=2015-01-20T17:00]
TimeInterval [startDate=2015-01-20T08:00, endDate=2015-01-20T17:00]
TimeInterval [startDate=2015-01-20T08:15, endDate=2015-01-20T17:15]
TimeInterval [startDate=2015-01-20T09:00, endDate=2015-01-20T19:00]
TimeInterval [startDate=2015-01-20T10:00, endDate=2015-01-20T19:00]
TimeInterval [startDate=2015-01-20T10:15, endDate=2015-01-20T19:15]
TimeInterval [startDate=2015-01-20T11:00, endDate=2015-01-20T20:00]
TimeInterval [startDate=2015-01-20T11:30, endDate=2015-01-20T18:00]
TimeInterval [startDate=2015-01-20T12:00, endDate=2015-01-20T23:59:59]
TimeInterval [startDate=2015-01-20T13:00, endDate=2015-01-20T16:00]
TimeInterval [startDate=2015-01-20T15:00, endDate=2015-01-20T22:00]
TimeInterval [startDate=2015-01-20T15:30, endDate=2015-01-20T18:30]
TimeInterval [startDate=2015-01-20T18:00, endDate=2015-01-20T19:00]
TimeInterval [startDate=2015-01-20T19:00, endDate=2015-01-21T04:00]
TimeInterval [startDate=2015-01-21T00:00, endDate=2015-01-21T23:59:59]
TimeInterval [startDate=2015-01-21T07:00, endDate=2015-01-21T17:00]
TimeInterval [startDate=2015-01-21T07:30, endDate=2015-01-21T17:00]
TimeInterval [startDate=2015-01-21T07:45, endDate=2015-01-21T12:45]
TimeInterval [startDate=2015-01-21T08:00, endDate=2015-01-21T17:00]
TimeInterval [startDate=2015-01-21T08:30, endDate=2015-01-21T17:30]
TimeInterval [startDate=2015-01-21T09:00, endDate=2015-01-21T19:00]
TimeInterval [startDate=2015-01-21T10:00, endDate=2015-01-21T19:00]
TimeInterval [startDate=2015-01-21T11:00, endDate=2015-01-21T20:00]
TimeInterval [startDate=2015-01-21T11:30, endDate=2015-01-21T18:00]
TimeInterval [startDate=2015-01-21T12:00, endDate=2015-01-21T23:59:59]
TimeInterval [startDate=2015-01-21T13:00, endDate=2015-01-21T22:00]
TimeInterval [startDate=2015-01-21T14:00, endDate=2015-01-21T20:30]
TimeInterval [startDate=2015-01-21T15:00, endDate=2015-01-21T21:00]
TimeInterval [startDate=2015-01-21T15:30, endDate=2015-01-21T18:30]
TimeInterval [startDate=2015-01-21T18:00, endDate=2015-01-21T19:00]
TimeInterval [startDate=2015-01-21T19:00, endDate=2015-01-21T19:50]
TimeInterval [startDate=2015-01-22T00:00, endDate=2015-01-22T23:59:59]
TimeInterval [startDate=2015-01-22T01:00, endDate=2015-01-22T04:30]
TimeInterval [startDate=2015-01-22T07:00, endDate=2015-01-22T17:00]
TimeInterval [startDate=2015-01-22T08:00, endDate=2015-01-22T17:00]
TimeInterval [startDate=2015-01-22T09:00, endDate=2015-01-22T19:00]
TimeInterval [startDate=2015-01-22T09:30, endDate=2015-01-22T18:30]
TimeInterval [startDate=2015-01-22T10:00, endDate=2015-01-22T19:00]
TimeInterval [startDate=2015-01-22T11:00, endDate=2015-01-22T20:00]
TimeInterval [startDate=2015-01-22T11:30, endDate=2015-01-22T19:30]
TimeInterval [startDate=2015-01-22T12:00, endDate=2015-01-22T23:59:59]
TimeInterval [startDate=2015-01-22T13:00, endDate=2015-01-22T18:00]
TimeInterval [startDate=2015-01-22T14:00, endDate=2015-01-22T22:00]
TimeInterval [startDate=2015-01-22T15:30, endDate=2015-01-22T18:30]
TimeInterval [startDate=2015-01-22T18:00, endDate=2015-01-22T19:00]
TimeInterval [startDate=2015-01-22T19:00, endDate=2015-01-23T04:00]
TimeInterval [startDate=2015-01-23T00:00, endDate=2015-01-23T23:59:59]
TimeInterval [startDate=2015-01-23T05:00, endDate=2015-01-23T17:00]
TimeInterval [startDate=2015-01-23T06:00, endDate=2015-01-23T15:00]
TimeInterval [startDate=2015-01-23T07:00, endDate=2015-01-23T17:00]
TimeInterval [startDate=2015-01-23T07:45, endDate=2015-01-23T12:45]
TimeInterval [startDate=2015-01-23T08:00, endDate=2015-01-23T17:00]
TimeInterval [startDate=2015-01-23T08:15, endDate=2015-01-23T17:15]
TimeInterval [startDate=2015-01-23T09:00, endDate=2015-01-23T22:00]
TimeInterval [startDate=2015-01-23T09:30, endDate=2015-01-23T17:30]
TimeInterval [startDate=2015-01-23T10:00, endDate=2015-01-23T19:00]
TimeInterval [startDate=2015-01-23T10:30, endDate=2015-01-23T17:00]
TimeInterval [startDate=2015-01-23T11:00, endDate=2015-01-23T20:00]
TimeInterval [startDate=2015-01-23T11:30, endDate=2015-01-23T18:00]
TimeInterval [startDate=2015-01-23T12:00, endDate=2015-01-23T23:59:59]

假设您想要一个地图作为最终结果,您可以执行

  • 按本地日期分组->Map<LocalDate, List<TimeInterval>>
  • 流式传输结果映射的条目
  • collect以使用相同的键(LocalDate(进行映射,并映射到新的TimeInterval对象,该对象具有来自条目值的最小startDate和最大endDate

示例:

Map<LocalDate, TimeInterval> result = 
sampleList.stream()
.collect(Collectors.groupingBy(t -> t.getStartDate().toLocalDate()))
.entrySet()
.stream()
.collect(Collectors.toMap(Entry::getKey,
e -> new TimeInterval(getMinDate(e.getValue()), getMaxDate(e.getValue()))));

使用两种辅助方法getMaxDategetMinDate:

private static LocalDateTime getMaxDate(final List<TimeInterval> list) {
return list.stream()
.collect(Collectors.reducing(LocalDateTime.MIN,
TimeInterval::getStartDate,
BinaryOperator.maxBy(LocalDateTime::compareTo)));
}
private static LocalDateTime getMinDate(final List<TimeInterval> list) {
return list.stream()
.collect(Collectors.reducing(LocalDateTime.MAX,
TimeInterval::getStartDate,
BinaryOperator.minBy(LocalDateTime::compareTo)));
}

您可以使用Java Stream API使用startDate对它们进行分组,然后使用startDate和endDate对每个组的结果数据结构进行一次排序,以获得startDate和endDate的最小和最大元素。

相关内容

最新更新