2016-10-10 6 views
5

私はストリーム上でソートされたメソッドを呼び出しています。そして、javaの医者は言う:Java 8のストリーム並べ替え文字列のリスト

"ソートされたメソッドは、自然な順序に従ってソートされたこのストリームの要素からなるストリームを返します。

しかし、私は以下のコードを実行する場合:なぜ私は自然の並べ替えの出力を取得していない午前

[b, a, z, p] 

として

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); 

私は出力を取得していますか?

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

あなたの方法のようなものに、この

list.stream().sorted(); 
System.out.println(list); 

list(ないソートされたストリーム)printlnをされた変更

+0

sorted()は、要素がソートされたストリームを返します。現在のストリームはソートされません。 – Snickers3192

+0

@ Snickers3192:「現在のストリーム」がないので、「リスト」をソートしないことを意味しました。間違ったことに名前を付けることは、まさに混乱につながります。 – Holger

+0

@Holger申し訳ありません。ストリームをリストに置き換えてください。 – Snickers3192

答えて

7

。代わりに(またはそれに加えて)、あなたの初期化ルーチンを短縮することができ、再収集List(おそらく予想通り)

[a, b, p, z] 
+2

私は 'forEach'ではなく、forEachOrderedを意味すると思います。 –

+0

'Arrays.asList'の結果を' ArrayList'にコピーする理由はありません。 'Arrays.asList'メソッドは' List'を返します。どちらの場合でも、リストは変更可能であり、 'list = list.stream()。sorted()のようにストリームの迂回路は必要ありません。collect(Collectors.toList());'単純な 'list.sort(null); 'はリストをインプレースでソートします。 – Holger

3

あなたのストリームは何のターミナルオペレーターを持っていないので、出力する

List<String> list = new ArrayList<>(Arrays.asList("b","a","z","p")); 
list = list.stream().sorted().collect(Collectors.toList()); 
System.out.println(list); 

のような処理されません。端末オペレータには、forEach、toArray、reduce、collectなどがありますが、これらに限定されません。あなたのコードセグメントは、

list.stream().sorted().forEachOrdered(System.out::println); 
+2

'forEach'ではなく' forEachOrdered'を意味すると思います。 –

+0

@LouisWassermanああ、ありがとう。私はそれを編集することを確認します。 –

0

と似ているはずです。ソートされたリストが必要な場合。

のは

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

にこの

list.stream().sorted(); 

を変更してみましょうが、このヘルプを願っています!

+0

残念ながら、これは受け入れられる答えではありません。なぜなら、OPのやり方は本当に正しいからです。指定された文字列のストリームの自然順序付けを取得するためにカスタムコンパレータを渡す必要はありません。BTW; 2つ以上の答えは、何が間違っていたのかを示します。あなたがそれから何かを学ぶことができるといいですね:) –

+0

@Jude: 'list.stream()。sorted()'と 'list.sort(...)'の呼び出しの違いを知っていますか?カスタムコンパレータは廃​​止されているかもしれませんが、この答えは正しいです。 – Holger

+0

@Holgerこんにちは、最初のものは自然な順序で要素を並べ替えるだけです。 *(compareToまたはobj.toString()。compareTo()の実装を使用)*。ああ、男...これはJava 8からListインターフェースに追加された新しいデフォルトメソッドです。申し訳ありませんが、私の悪い。しかし、この答えは、中間操作がターミナル操作をしなければ始動しないという事実を指摘していない。 –

2

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

関連する問題