带有比较器的java 8 stream.sorted

nim*_*o23 9 java comparator java-8

我有一个排序(使用Comparators),我不知道选择哪个版本:

版本1:

public static void sort(Set<User> users) {
    users = users.stream()
    .sorted(sort_gender.thenComparing(sort_age))
    .collect(Collectors.toCollection(LinkedHashSet::new));
}
Run Code Online (Sandbox Code Playgroud)

版本2:

public static Set<User> sort(Set<User> users) {
    return users.stream()
    .sorted(sort_gender.thenComparing(sort_age))
    .collect(Collectors.toCollection(LinkedHashSet::new));
}
Run Code Online (Sandbox Code Playgroud)

版本3:

public static void sort(Set<User> users) {
    users.stream()
    .sorted(sort_gender.thenComparing(sort_age))
    .collect(Collectors.toSet());
}
Run Code Online (Sandbox Code Playgroud)

版本4

public static List<User> sort(Set<User> users){

List<User> list = new ArrayList<>(users);
list.sort(sort_gender.thenComparing(sort_age));
return list;
}
Run Code Online (Sandbox Code Playgroud)

所有版本对一个集进行排序并返回已排序的集.我知道,只有linkedHashSet可以保留排序.

我应该选择哪一个,我只想对输入属性用户进行排序并将其返回,那么版本1最适合这种情况吗?(对于所有情况,我希望输入用户的引用与输出用户的引用相同.)

编辑:我想,我会选择第4版.

Eug*_*ene 10

我会添加第4个方法(如果您可以更改该方法以返回已排序的方法Set)

 users.stream()
      .collect(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing...)))
Run Code Online (Sandbox Code Playgroud)

我会返回一个SortedSet为调用者明确指出这实际上是排序的.

如果没有,你可以这样做:

SortedSet<User> sorted = new TreeSet<>(Comparator.comparing...)
sorted.addAll(users);
Run Code Online (Sandbox Code Playgroud)

  • @ nimo23,1.有一个`SortedSet <T>`接口,`TreeSet <T>`是其中的一部分,甚至更好地显示意图.2.说"A的性能优于B"而没有说明:(a)我们在这里谈论的性能和(b)之后应该使用的集合 - 并不是很有用. (5认同)
  • @nimo23`TreeSet`的潜在好处是,如果你向返回的集合添加一个元素,那么集合将保持有序,而使用`LinkedHashSet`时,元素将在迭代集合时返回.但正如你所说,`LinkedHashSet`具有更好的性能. (4认同)
  • @ nimo23对,但如果再次传递那会怎么样?收到`LinkedHashSet`的人可能不知道它实际上是排序的 (3认同)

Mic*_*ael 5

第一版确实没有任何效果.您正在更改参数的引用,users但不会更改作为参数传递但不返回任何内容的集合.

版本2正常工作.

版本3试图将排序集存储在不维护顺序的集合中.它实际上与返回你给出的集合没有什么不同.来自JavaDoc toSet:

返回的Set的类型,可变性,可序列化或线程安全性无法保证