[英]Using streams to find a minimum of a list of Date objects from a Map<String, List<Date>>
我最初尝试的
Map<String, List<Date>> subscriberCreatedDateSet = data.stream().collect(Collectors
.groupingBy(SubscriberActivityAggData::getSubscriberAddress
, Collectors.mapping(SubscriberActivityAggData::getEventTime, Collectors.toList())));
接着
Map<String, Date> subscriberCreatedDate = subscriberCreatedDateSet.entrySet().stream()
.map(item->Collections.min(item.getValue()))
.collect(Collectors.mapping());
这是不完整的,因为我找不到正确的方法。
is there a way to do it properly? or should I loops and o it
您可以在单个管道中执行此操作:
Map<String, Optional<Date>> subscriberCreatedDate =
data.stream()
.collect(Collectors.groupingBy(SubscriberActivityAggData::getSubscriberAddress,
Collectors.mapping(SubscriberActivityAggData::getEventTime,
Collectors.minBy(Date::compareTo))));
唯一的缺点是你得到一个Map<String, Optional<Date>>
而不是Map<String, Date>
,但是由于没有一个组可以为空,因此Optional
也不能为空,所以你只需每次访问Map
时都必须添加.get()
。
例如:
Date someDate = subscriberCreatedDate.get("someKey").get();
或者,您可以在该Map
的条目上运行第二个Stream
管道以生成Map<String,Date>
。
您可以使用toMap
而不是groupingBy
在单个管道中简单地执行此操作:
Map<String, Date> subscriberCreatedDate = data.stream()
.collect(Collectors.toMap(SubscriberActivityAggData::getSubscriberAddress,
SubscriberActivityAggData::getEventTime,
BinaryOperator.minBy(Comparator.naturalOrder())));
注意- 这也使您免于生成Map
中的Optional
包装值的开销。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.