java 8 stream.sorted avec comparateur en jeux

J’ai un ensemble à sortinger (avec des comparateurs) et je ne sais pas quelle version choisir:

version 1:

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

version 2:

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

version 3:

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

version 4

 public static List sort(Set users){ List list = new ArrayList(users); list.sort(sort_gender.thenComparing(sort_age)); return list; } 

Toutes les versions sortingent un ensemble et renvoient celui-ci. Je sais que seul linkedHashSet peut préserver la commande.

Lequel dois-je choisir? Je souhaite uniquement sortinger les utilisateurs de propriétés en entrée et les renvoyer. La version 1 est-elle donc la meilleure solution? (Pour tous les cas, je souhaite que les références des utilisateurs d’entrée soient les mêmes que pour les utilisateurs de sortie.)

EDIT: Je pense que je vais choisir la version 4.

J’appendais une 4ème méthode (si vous êtes d’accord pour changer cette méthode pour retourner l’ Set sortingé)

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

Je retournerais un SortedSet pour rendre explicite pour l’appelant que cela est réellement sortingé.

Sinon, vous pourriez faire:

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

La première version ne fait rien. Vous changez la référence du paramètre users mais ne modifiez pas le jeu passé en argument et ne retournez rien.

La version deux fonctionne correctement.

La troisième version tente de stocker un ensemble sortingé dans un ensemble qui ne conserve pas l’ordre. En réalité, ce n’est pas différent de renvoyer l’ensemble que vous avez reçu. Depuis le JavaDoc pour toSet :

Il n’y a aucune garantie sur le type, la mutabilité, la sérialisabilité ou la sécurité des threads de l’ensemble renvoyé