我正在尝试使用Comparator.comparing对Java集进行排序。
我已经尝试了以下方法
Set<Survey> sortedSet = surveySet.stream().sorted(Comparator.comparing(Survey::getCreatedDate).reversed()).collect(Collectors.toSet())
它返回相同的排序,但不按createdDate排序(最新的)。我在做什么错了?
更新:
只需提供最新的信息,说明我如何实际解决问题。
将集合转换为List,然后将Comparator.comparing应用于有效的List。
List<Survey> sortedSurveyList = surveySet.stream().collect(Collectors.toList());
Collections.sort(sortedSurveyList,(Comparator.comparing(Survey::getCreatedDate).reversed()));
return sortedSurveyList;
尽管如此,这不是我想要的答案。我想知道为什么Comparator.comparing不适用于Set。
答案 0 :(得分:4)
根据Collectors#toSet
上的文档
返回一个收集器,该收集器将输入元素累积到一个新的Set中。不保证返回的Set的类型,可变性,可序列化性或线程安全性;如果需要对返回的Set进行更多控制,请使用toCollection(Supplier)。
这是一个无序的收集器。
因此使用该收集器进行排序然后收集是没有意义的。取而代之的是,您必须使用Collectors.toCollection(Supplier)
,提供一个保证排序的集合,例如LinkedHashSet
。
答案 1 :(得分:1)
您正在使用Set
,它没有顺序。尝试使用具有顺序的集合,例如SortedSet
(实现:TreeSet
)或List
。
final Set<Survey> surveySet = null;
final List<Survey> sortedList = surveySet.stream()
.sorted(Comparator.comparing(Survey::getCreatedDate).reversed())
.collect(Collectors.toList());
final SortedSet<Survey> sortedSet = surveySet.stream()
.collect(Collectors.toCollection(
() -> new TreeSet<>(Comparator.comparing(Survey::getCreatedDate).reversed())));