java 8 stream.sorted 组中有比较器

java 8 stream.sorted with comparator in sets

我有一组要排序(带比较器),但我不知道该选择哪个版本:

版本 1:

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

版本 2:

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

版本 3:

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

版本 4

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

List<User> list = new ArrayList<>(users);
list.sort(sort_gender.thenComparing(sort_age));
return list;
}

所有版本都对集合进行排序,return对排序后的集合进行排序。我知道,只有 linkedHashSet 可以保留顺序。

我应该选择哪个,我只想对输入属性 users 和 return 进行排序,那么版本 1 是否最适合这种情况? (对于所有情况,我希望输入用户的引用与输出用户的引用相同。)

编辑:我想,我会选择版本 4。

我会添加第 4 个方法(如果您可以将该方法更改为 return 已排序 Set

 users.stream()
      .collect(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing...)))

我会 return a SortedSet 让调用者明确知道这实际上是排序的。

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

SortedSet<User> sorted = new TreeSet<>(Comparator.comparing...)
sorted.addAll(users);

版本一实际上什么也没做。您正在更改参数 users 的引用,但未更改作为参数传递且不返回任何内容的集合。

版本二工作正常。

版本三试图将一个排序集存储在一个不保持顺序的集合中。这实际上与归还给您的套装没有什么不同。来自 toSet:

的 JavaDoc

There are no guarantees on the type, mutability, serializability, or thread-safety of the Set returned