繁体   English   中英

使用流从 Map 中找到最少的 Date 对象列表<string, list<date> &gt;</string,>

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM