java - 无法使用 Comparator.Comparing 对 Java Set 进行排序
问题描述
我正在尝试使用 Comparator.comparing 对 Java 集进行排序。
我已经尝试过以下
Set<Survey> sortedSet = surveySet.stream().sorted(Comparator.comparing(Survey::getCreatedDate).reversed()).collect(Collectors.toSet())
它返回相同的排序,而不按 createdDate 排序(与最近的一样)。我究竟做错了什么?
更新:
只是提供一个更新,我实际上是如何通过变通解决我的问题的。
将集合转换为列表,然后在有效的列表上应用 Comparator.comparing。
List<Survey> sortedSurveyList = surveySet.stream().collect(Collectors.toList());
Collections.sort(sortedSurveyList,(Comparator.comparing(Survey::getCreatedDate).reversed()));
return sortedSurveyList;
然而,这不是我正在寻找的答案。我想知道为什么 Comparator.comparing 不适用于 Set。
解决方案
根据文档Collectors#toSet
返回一个收集器,它将输入元素累积到一个新的 Set 中。不保证返回的 Set 的类型、可变性、可序列化性或线程安全性;如果需要对返回的 Set 进行更多控制,请使用 toCollection(Supplier)。
这是一个无序收集器。
因此,使用该收集器进行排序然后收集是没有意义的。您必须改为使用Collectors.toCollection(Supplier)
,提供一个保证排序的集合,例如LinkedHashSet
.
推荐阅读
- angular - 将数组转换为 ChartJS 所需的格式
- azure-devops - Azure DevOps - Power BI 中的 Sprint(容量数据)
- javascript - 无法获取另一个函数返回的数据作为 amchart 中的数据提供者
- javascript - 反应搜索栏。当 Input 的值改变时触发 onKeyUp
- sql-server - Git 中的 SQL 文件变为二进制或不可读
- python - 使用 python 2.7 将字符串字典列表转换为另一个字典并以表格格式打印
- flutter - 为什么过滤数组只提供 1 个元素而不是 Flutter/Dart 元素数组?
- bokeh - 散景动态标题
- ruby - 为什么为 describe 执行 before(:context) ?理想情况下,它应该在规范中的 Context 之前执行
- python - 带有 django-filters 的样式表