Какой идиоматический способ исчерпать очередь в Java 8? - PullRequest
0 голосов
/ 04 июня 2018

Скажите, что у меня есть очередь, и я хочу исчерпать ее.То, как я бы это сделал, выглядит примерно так:

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

, но это похоже на архаичный метод.

Я бы хотел что-то более похожее на forEach.Он, конечно, присутствует - Queue является Collection - но он перебирает элементы, а не потребляет их.

В идеале мне бы понравился метод pollEach для Queue - но я не могу найти что-нибудь подходящее.

Как вы пишете такой код?

1 Ответ

0 голосов
/ 04 июня 2018

Вы можете использовать свой собственный генератор, который вызывает poll() в очереди:

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

Этот метод также является примером получения контроля над тем, что передает поток.Вы можете управлять такими вещами, как блокировка и т. Д. Шаг takeWhile в этом случае просто показывает, как можно определить конец данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...