在Java 8中耗尽队列的惯用方法是什么?

Bex*_*Bex 4 java queue java-8

说我有一个队列,我想用尽它.我会这样做的方式是这样的

void emptyQueue(Queue<T> q) {
  T i;
  while ((i = q.poll()) != null)
    consume(i);
}
Run Code Online (Sandbox Code Playgroud)

但这感觉就像一种古老的方法.

我想要更像这种forEach方法的东西.它当然是存在的 - Queue存在Collection- 但它迭代元素,而不是消耗它们.

理想情况下,我会喜欢一种pollEach方法Queue- 但我似乎找不到合适的东西.

你是怎么写这种代码的?

ern*_*t_k 5

您可以使用自己的生成器来调用poll()队列:

Stream.generate( () -> q.poll() )
    .takeWhile(Objects::nonNull) //Note that this is only available in java 9
    .forEach(i -> consume(i));
Run Code Online (Sandbox Code Playgroud)

该方法也是控制通过流的内容的示例.您可以管理阻塞等操作.takeWhile本例中的步骤仅显示如何检测数据的结尾.

  • 我非常喜欢这个解决方案,你可以缩短`() - > q.poll()`到`q :: poll`以及`i - >消耗(i)`到`this :: consume`(假设` consume`是类的实例成员`) (2认同)