带有比较器的java 8 stream.sorted

时间:2018-01-23 12:26:07

标签: java java-8 comparator

我有一套排序(使用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版。

2 个答案:

答案 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返回的线程安全性