【发布时间】:2018-07-11 10:35:53
【问题描述】:
我有一个
class MedicationPeriod {
LocalDateTime startDate, endDate;
//assume getters and setters
}
然后我有一个List<MedicationPeriod> medPrd = getMedPeriods();
medPrd 中的元素可能具有相同的 startDate。
现在我想过滤列表,以便对于具有相同 startDate 的元素,具有最大 endDate 的元素应保留在列表中。 IE。拥有最长的一天。
示例:如果列表元素是:
1) startDate = 2018-Jan-1, endDate = 2018-Feb-25 // 25 天
2) startDate = 2018-Jan-1, endDate = 2018-Feb-20 // 20 天
3) startDate = 2018-Jan-5, endDate = 2018-Feb-25 // startDate 不同,我们不在乎
所以最终列表应该只有元素 1) 和 3)。元素 2 将被删除,因为具有相同 startDate 的其他 MedicationPeriod 具有更大的 endDate。
这是我获得结果的尝试(不愉快地工作):
mps.stream().collect(Collectors.toMap(MedicationPeriod::getStartDate, e -> e, (a,b) -> a.endDate.isAfter(b.endDate) ? a : b)).values();
我的要求:
我想要
List<MedicationPeriod>而不是Collection<MedicationPeriod>,因为我的解决方案是Collection<>我想在不收集它们并使用
.values()的情况下实现这一点,因为我可能会在流中进行进一步的转换并稍后收集它们。
假设我必须在过滤 MedicationPeriods 后进行一些测试,然后将其收集到:
class DateRange {
LocalDate startDate, endDate;
}
如何只用一个终端操作来做到这一点?
【问题讨论】:
-
我认为,应该可以用
BinaryOperator.maxBy(Comparator.comparing(MedicationPeriod::getEndDate))替换(a,b) -> a.endDate.isAfter(b.endDate) ? a : b)
标签: collections filter java-8 java-stream