【问题标题】:Weird loops used in Spliterator of Java 8 [duplicate]Java 8的Spliterator中使用的奇怪循环[重复]
【发布时间】:2016-09-16 08:28:28
【问题描述】:

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

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

他们为什么要使用

do { } while (tryAdvance(action));

而不是

while(tryAdvance(action));

?

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

【问题讨论】:

  • 所以两个循环都会运行,只要终止条件 tryAdvance(action) 返回 true。
  • 虽然这肯定是重复的,但我认为另一个问题中接受的答案并没有真正回答问题(相反,它提出了新的问题......)
  • 纯粹是根据风格做出的选择。其他两种写法(while (c());while (c()) {}),在阅读代码时,似乎都提出了“这真的是作者的意思吗?”的问题,而我们确定的形式似乎最清楚地表达意图。您的意见可能会有所不同。
  • @BrianGoetz 那么,如果是风格问题,那么它与另一个问题的答案中隐含的隐藏同步无关?
  • 在这种情况下不是;这种情况下的计算是纯线程本地的。

标签: java java-8 spliterator


【解决方案1】:

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

【讨论】:

  • 你在说什么话题?是否有任何(隐藏的)同步涉及?
  • "[...] 因为 do{} 是空的,所以线程将等待直到通知 [...]" 这没有意义。如果发生一些同步,它只能在条件之内。为什么条件是在循环的开始还是结束时很重要?
猜你喜欢
  • 2017-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-30
  • 1970-01-01
  • 1970-01-01
  • 2021-01-25
  • 1970-01-01
相关资源
最近更新 更多