繁体   English   中英

带有比较器的java 8 stream.sorted

[英]java 8 stream.sorted with comparator in sets

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

版本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;
}

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

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

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

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

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

我会返回一个SortedSet ,使调用者明确它实际排序。

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

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

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

版本2正常工作。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM