我有一个列表如何将其转换为Map,其中我可以将具有最小值的键作为键值对。我想将此代码转换为流。
Map<Long, Date> formToDate = new HashMap<>();
for(FormInstance formInstance : formInstances) {
if(formToDate.get(formInstance.getForm().getId()) == null) {
formToDate.put(formInstance.getForm().getId(), formInstance.getCreatedDate());
}
else{
Date prevDate = formToDate.get(formInstance.getForm().getId());
Date thisDate = formInstance.getCreatedDate();
formToDate.put(formInstance.getForm().getId(), prevDate.before(thisDate) ? prevDate : thisDate);
}
}
这样的事情:
Map<Long, List<Date>> formToDate = formInstances.stream()
.collect(
Collectors.groupingBy(formInstance -> formInstance.getForm().getId(),
Collectors.mapping(FormInstance::getCreatedDate, Collectors.toList())));
但我没有返回列表,而是希望拥有最小的日期。
答案 0 :(得分:1)
有Collector::toMap
实现提供合并功能。这可用于确定具有相同ID的两个不同条目的最小日期,如:
Map<Long, Date> minimum = formInstances.stream().collect(Collectors.toMap(
fi -> fi.getForm().getId(),
FormInstance::getCreatedDate,
(date, date2) -> date.before(date2) ? date : date2
));
答案 1 :(得分:0)
如果您已有列表并希望避免创建流,则可以使用新的Map.merge()
方法:
Map<Long, Date> minimum = new HashMap<>();
forms.forEach(form -> minimum.merge(form.getForm().getId(),
form.getCreatedDate(),
(date, date2) -> date.before(date2) ? date : date2));
除merge
之外,Map
还有许多方法可以让这样的事情更容易:computeIfAbsent
,getOrDefault
,甚至是&#34; old&#34; containsKey
方法可以通过替换常用的样板代码片段(例如您使用的代码片段)使代码更具可读性:
if (map.get(key) == null) { add } else { test and put }
答案 2 :(得分:0)
另一种选择是将Collectors.groupingBy
和Collectors.mapping
组合使用Collectors.minBy
:
Map<Long, Optional<Date>> formToDate =
formInstances.stream()
.collect(Collectors.groupingBy(fi -> fi.getForm().getId(),
Collectors.mapping(FormInstance::getCreatedDate,
Collectors.minBy(Date::compareTo))));