我有一套排序(使用Comparators),我不知道选择哪个版本:
版本1:
user=> (into '() (reverse (cons 1 (list 2 3))))
(1 2 3)
user=> (type (into '() (reverse (cons 1 (list 2 3)))))
clojure.lang.PersistentList
第2版:
public static void sort(Set<User> users) {
users = users.stream()
.sorted(sort_gender.thenComparing(sort_age))
.collect(Collectors.toCollection(LinkedHashSet::new));
}
版本3:
public static Set<User> sort(Set<User> users) {
return users.stream()
.sorted(sort_gender.thenComparing(sort_age))
.collect(Collectors.toCollection(LinkedHashSet::new));
}
第4版
public static void sort(Set<User> users) {
users.stream()
.sorted(sort_gender.thenComparing(sort_age))
.collect(Collectors.toSet());
}
所有版本对一个集进行排序并返回有序集。我知道,只有linkedHashSet可以保留排序。
我应该选择哪一个,我只想对输入属性用户进行排序并将其返回,那么版本1最适合这种情况吗? (对于所有情况,我希望输入用户的引用与输出用户的引用相同。)
编辑:我想,我会选择第4版。
答案 0 :(得分:8)
我会添加第4个方法(如果您可以更改该方法以返回已排序的Set
)
users.stream()
.collect(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing...)))
我会返回一个SortedSet
,使调用者显式确定这是实际已排序的。
如果没有,你可以这样做:
SortedSet<User> sorted = new TreeSet<>(Comparator.comparing...)
sorted.addAll(users);
答案 1 :(得分:5)
版本1实际上没有任何效果。您正在更改参数users
的引用,但不会更改作为参数传递但不返回任何内容的集。
第二版正常运作。
第三版试图将一个有序集存储在一个不维护顺序的集合中。它实际上与返回你给出的集合没有什么不同。来自toSet
的JavaDoc:
不保证类型,可变性,可序列性或 Set返回的线程安全性