Java 如何将以下代码转换为流

Java 如何将以下代码转换为流,java,lambda,java-8,stream,java-stream,Java,Lambda,Java 8,Stream,Java Stream,我有一个列表,如何将其转换为一个映射,其中可以有最小值的键作为键值对。我想把这段代码转换成流 Map<Long, Date> formToDate = new HashMap<>(); for(FormInstance formInstance : formInstances) { if(formToDate.get(formInstance.getForm().getId()) == null) { formToDate.

我有一个列表,如何将其转换为一个映射,其中可以有最小值的键作为键值对。我想把这段代码转换成流

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 formToDate=newhashmap();
for(FormInstance FormInstance:FormInstance){
if(formToDate.get(formInstance.getForm().getId())==null){
formToDate.put(formInstance.getForm().getId(),formInstance.getCreatedDate());
}
否则{
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())));
Map formToDate=formInstances.stream()
.收集(
Collectors.groupingBy(formInstance->formInstance.getForm().getId(),
Collectors.mapping(FormInstance::getCreatedDate,Collectors.toList());

但是我不想返回所有的列表,而是希望有一个最小的日期

有一个提供合并功能的
收集器::toMap
实现。这可用于从两个具有相同id的不同条目中确定最小日期,如:

Map<Long, Date> minimum = formInstances.stream().collect(Collectors.toMap(
        fi -> fi.getForm().getId(), 
        FormInstance::getCreatedDate, 
        (date, date2) -> date.before(date2) ? date : date2
));
Map-minimum=formInstances.stream().collect(Collectors.toMap(
fi->fi.getForm().getId(),
FormInstance::getCreatedDate,
(日期,日期2)->日期。在(日期2)之前?日期:日期2
));

如果您真的想使用streams,Flown的答案很好,但通常可以在不使用streams的情况下使用新的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));
Map-minimum=newhashmap();
forms.forEach(form->minimum.merge(form.getForm().getId()),
form.getCreatedDate(),
(日期,日期2)->日期。在(日期2)之前?日期:日期2);
除了
merge
Map
还有许多方法可以简化这类工作:
computeIfAbsent
getOrDefault
,甚至“old”
containsKey
方法都可以通过替换常见的样板代码片段,使代码更具可读性,比如您使用的:


if(map.get(key)==null){add}else{test and put}
另一个选项是将
收集器.groupingBy
收集器.mapping
收集器.minBy>结合使用:

Map<Long, Optional<Date>> formToDate =
    formInstances.stream()
                 .collect(Collectors.groupingBy(fi -> fi.getForm().getId(),
                                                Collectors.mapping(FormInstance::getCreatedDate,
                                                                   Collectors.minBy(Date::compareTo))));
映射formToDate=
formInstances.stream()
.collect(收集器.groupingBy(fi->fi.getForm().getId(),按,
Collectors.mapping(FormInstance::getCreatedDate,
Collectors.minBy(Date::compareTo));

请查看该网站的工作原理、主题中的问题以及相应的问题。另请参见:也许您最好在此处编写自己的
收集器
。或者使用
收集器。minBy
收集器。。。但是上面给出的代码不仅仅返回最小的日期!