web-dev-qa-db-ja.com

Java 8文字列のストリームソートリスト

ストリームでソート済みメソッドを呼び出しています。そして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]

自然なソートの出力が得られないのはなぜですか?

8
saurabh suman

これを変える

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]
12
Elliott Frisch

並べ替えの結果を収集してから、リストに割り当てる必要があります。

    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);
6
Morozov Ivan

ソートされたリストが必要な場合。

これを変えましょう

list.stream().sorted();

list.sort((e1, e2) -> e1.compareTo(e2));

このヘルプを願っています!

3
David Pham

ストリームには端末演算子がないため、処理されません。端末オペレーターには、forEach、toArray、reduce、collectが含まれますが、これらに限定されません。コードセグメントは次のようになります

list.stream().sorted().forEachOrdered(System.out::println);
3
user6929867