如何将以下代码转换为流

时间:2017-12-01 06:15:13

标签: java lambda java-8 stream java-stream

我有一个列表如何将其转换为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())));

但我没有返回列表,而是希望拥有最小的日期。

3 个答案:

答案 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)

如果你真的想要使用流,那么Flown的答案很好,但是通常可以在没有利用更新的Java功能的情况下做到。我已经看到很多情况(包括我自己),其中使用流来使用流而不是采用更简单,更直接的方法。

如果您已有列表并希望避免创建流,则可以使用新的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还有许多方法可以让这样的事情更容易:computeIfAbsentgetOrDefault,甚至是&#34; old&#34; containsKey方法可以通过替换常用的样板代码片段(例如您使用的代码片段)使代码更具可读性:

if (map.get(key) == null) { add } else { test and put }

答案 2 :(得分:0)

另一种选择是将Collectors.groupingByCollectors.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))));