Java 8 Spliterator 中使用的奇怪循环

erd*_*aca 5 java java-8 spliterator

有谁知道为什么java.util.Spliterator当循环体为空时,实现使用 do-while 而不是 while 循环?例如,其实现forEachRemaining是:

default void forEachRemaining(Consumer<? super T> action) {
    do { } while (tryAdvance(action));
}
Run Code Online (Sandbox Code Playgroud)

他们为什么要使用

do { } while (tryAdvance(action));
Run Code Online (Sandbox Code Playgroud)

代替

while(tryAdvance(action));
Run Code Online (Sandbox Code Playgroud)

有什么我不知道的优点吗?

Cza*_*ing -2

逻辑检查在 do{} 主体之后执行。这可以通过多种方式使用,但与 while 循环执行相同的操作,并在最后进行逻辑检查。因为 do{} 为空,所以线程将等待直到收到通知,然后执行逻辑检查,而不是执行逻辑检查 then if true wait。

  • “[...]因为 do{} 为空,线程将等待直到收到通知[...]”这是没有意义的。如果发生某种同步,则只能在该条件内。为什么条件是在循环的开始还是结束很重要? (3认同)