ストリームでソート済みメソッドを呼び出しています。そしてJava docのコメント:
「ソートされたメソッドは、自然順序に従ってソートされた、このストリームの要素で構成されるストリームを返します。」
しかし、以下のコードを実行すると:
List<String> list = new ArrayList<String>();
list.add("b");
list.add("a");
list.add("z");
list.add("p");
list.stream().sorted();
System.out.println(list);
として出力を取得しています
[b, a, z, p]
自然なソートの出力が得られないのはなぜですか?
これを変える
list.stream().sorted();
System.out.println(list);
のようなものに
list.stream().sorted().forEachOrdered(System.out::println);
メソッドはlist
(ソートされたストリームではありません)のprintlnです。代わりに(または追加で)、初期化ルーチンを短縮して、List
を再収集することもできます。
List<String> list = new ArrayList<>(Arrays.asList("b","a","z","p"));
list = list.stream().sorted().collect(Collectors.toList());
System.out.println(list);
どの出力(予想どおり)
[a, b, p, z]
並べ替えの結果を収集してから、リストに割り当てる必要があります。
List<String> list = new ArrayList<String>();
list.add("b");
list.add("a");
list.add("z");
list.add("p");
list = list.stream().sorted().collect(Collectors.toList());
System.out.println(list);
ソートされたリストが必要な場合。
これを変えましょう
list.stream().sorted();
に
list.sort((e1, e2) -> e1.compareTo(e2));
このヘルプを願っています!
ストリームには端末演算子がないため、処理されません。端末オペレーターには、forEach、toArray、reduce、collectが含まれますが、これらに限定されません。コードセグメントは次のようになります
list.stream().sorted().forEachOrdered(System.out::println);