Как конвертировать for-l oop в продюсера? - PullRequest
0 голосов
/ 02 апреля 2020

Существует интерфейс SynchronousProducer , который поддерживает две операции:

public interface SynchronousProducer<ITEM> {
    /**
     * Produces the next item.
     *
     * @return produced item
     */
    ITEM next();

    /**
     * Tells if there are more items available.
     *
     * @return true if there is more items, false otherwise
     */
    boolean hasNext();
}

Потребитель спрашивает производителя, есть ли еще доступные элементы, и если ни один не входит в последовательность выключения.

Теперь следует за вопросом.

На данный момент существует цикл for-l oop, который действует как производитель:

for (ITEM item: items) {
  consumer.consume(item);
}

Задача состоит в том, чтобы преобразовать управляющий код в следующее:

while (producer.hasNext()) {
  consumer.consume(producer.next())
}

consumer.shutdown();

Вопрос. С учетом предметов : как написать производителю, реализующему SynchronousProducer интерфейс и дублирующему логи c для for-l oop, показанным выше?

1 Ответ

1 голос
/ 02 апреля 2020

Если items реализует Iterable, вы можете адаптировать его к интерфейсу SynchronousProducer следующим образом:

class IterableProducer<T> implements SynchronousProducer<T> {

    private Iterator<T> iterator;

    public IterableProducer(Iterable<T> iterable) {
        iterator = iterable.iterator();
    }

    @Override
    public T next() {
        return iterator.next();
    }

    @Override
    public boolean hasNext() {
        return iterator.hasNext();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...