如何使用流进行排序?
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(...)
运算符对流中的事件进行排序,但这没有用,因为紧接着您将它们分组并将它们收集到 Map
中 Map
值。
通常,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 文档。
(请注意,上述解决方案将按字母顺序对版本字符串进行排序,这可能不是您想要的)。
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(...)
运算符对流中的事件进行排序,但这没有用,因为紧接着您将它们分组并将它们收集到 Map
中 Map
值。
通常,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 文档。
(请注意,上述解决方案将按字母顺序对版本字符串进行排序,这可能不是您想要的)。