如何使用流进行排序?

How to sort using streams?

int i = 0;    
return events.stream()
            .sorted(Comparator.comparing(Event::getMajorVersion).thenComparing(Event::getMinorVersion))
            .collect(Collectors.groupingBy(Event::getId, Collectors.toMap(cae -> cae.getMajorVersion() + "." + cae.getMinorVersion(),
                    cae -> cae.getDate().get(i).getEndDate() != null ? "Yes" : "No")));
}

这样做我没有得到想要的排序输出?我可以在这里做什么来获取排序后的数据?

您现在使用的 .sorted(...) 运算符对流中的事件进行排序,但这没有用,因为紧接着您将它们分组并将它们收集到 MapMap 值。

通常,Map 没有顺序,因此您通过对元素进行排序创建的顺序将丢失。

您可以使用允许您指定供应商的另一个版本的 Collectors.toMap(...),这样您就可以自行决定要创建哪种类型的 Map

例如,您可以让它创建一个排序的地图,例如 TreeMap,以您想要的方式对事件进行排序。像这样:

return events.stream().collect(Collectors.groupingBy(Event::getId,
        Collectors.toMap(
                cae -> cae.getMajorVersion() + "." + cae.getMinorVersion(),
                cae -> cae.getDate().get(i).getEndDate() != null ? "Yes" : "No",
                (e1, e2) -> e1, TreeMap::new)));

请注意,您还需要指定一个合并函数,我在此处使用 lambda 表达式实现了该函数:(e1, e2) -> e2)。 merge 函数决定了当有两个元素具有相同的键时要做什么。地图中的元素必须具有唯一键。

请参阅此版本 Collectors.toMap(...) 的 API 文档。

(请注意,上述解决方案将按字母顺序对版本字符串进行排序,这可能不是您想要的)。