web-dev-qa-db-ja.com

java 8 stream.sorted withコンパレータとセットで

(コンパレータを使用して)ソートするセットがあり、どのバージョンを選択するかわかりません:

バージョン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を選択すると思います

9
nimo23

私は4番目のメソッドを追加します(そのメソッドを変更して、並べ替えられたSetを返すことができる場合)

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

私はSortedSetを返して、これが実際にソートされていることを呼び出し側に明示します。

そうでない場合は、次のことができます。

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

バージョン1は事実上何もしません。パラメーターusersの参照を変更していますが、引数として渡されたセットを変更せず、何も返さない場合。

バージョン2は正しく動作します。

バージョン3は、ソートされたセットを順序を維持しないセットに格納しようとしています。与えられたセットを返すことと実質的に違いはありません。 toSet のJavaDocから:

返されるSetのタイプ、変更可能性、直列化可能性、またはスレッドセーフ性は保証されません

5
Michael