поток java 8.сортировка с помощью компаратора в наборах


У меня есть набор для сортировки (с Компараторами), и я не знаю, какую версию выбрать:

Версия 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 самое лучшее для этого случая? (Во всех случаях я хочу, чтобы ссылки входных пользователей были такими же, как и для выходных пользователей.)

EDIT: я думаю, что выберу версию 4.

2 7

2 ответа:

Я бы добавил 4-й метод (если вы согласны изменить этот метод, чтобы вернуть сортированный Set)

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

Я бы вернул a SortedSet, чтобы сделать явным для вызывающего, что это действительно сортируется.

Если нет, то вы могли бы сделать:

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

Версия первая фактически ничего не делает. Вы изменяете ссылку на параметр users , но не изменяете набор, который передается в качестве аргумента, и ничего не возвращаете.

Вторая версия работает правильно.

Версия три пытается сохранить сортированный набор в наборе, который не поддерживает порядок. Фактически это ничем не отличается от возврата набора, который вам дали. От Джавадока для toSet:

Нет никаких гарантий по типу, изменчивость, сериализуемость или потокобезопасность возвращенного набора