2016-05-19 8 views
4

java.util.Spliterator実装でwhileループではなくwhileループを使用する理由を知っていますか?例えば、forEachRemainingの実装は次のとおりです。Spliterator Javaで使用される奇妙なループ8

default void forEachRemaining(Consumer<? super T> action) { 
    do { } while (tryAdvance(action)); 
} 

は、なぜ彼らは

do { } while (tryAdvance(action)); 

代わりの

while(tryAdvance(action)); 

を使うのでしょうか?

わからないことがありますか?

+0

したがって、終了条件 'tryAdvance(action) 'がtrueを返す限り、両方のループが実行されます。 –

+1

これは確かに重複していますが、私は他の質問の受け入れられた答えが本当に質問に答えるものではないと思う(代わりに、新しいものを上げる...) – Marco13

+3

選択は純粋にスタイルで行われました。他の2つの方法( 'while(c())'と 'while(c()){}')は、コードを読むときに、私たちが定住した形は意図を最もはっきりと表現しているように見えました。あなたの意見は異なる場合があります。 –

答えて

-2

論理チェックはdo {}の本体の後に実行されます。これは多くの方法で利用できますが、最後に論理チェックをしているwhileループと同じことをします。 do {}は空であるため、スレッドは通知されるまで待機し、論理チェックを実行するのではなく論理チェックを実行してから、真の待機を実行します。

+0

あなたはどんなスレッドを話していますか?同期が隠されていますか? –

+3

"[...] do {}が空であるため、スレッドは通知されるまで待機します[...]"これは意味をなさない。何らかの同期が行われた場合、同期は条件内でのみ可能です。条件がループの開始または終了のどちらにあるのが重要なのはなぜですか? – Turing85