/
cod43
/
home_tasks
Обзор
Документация
Войти
/
cod43
/
home_tasks
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/task4/IterableOnceFromLambda.java
80 строк
3 KB
cod43
first_commit
29 июл 2025, 19:46
29 июл 2025, 19:46
c3aa089
Код
Авторство
О чём код?
package task4; import java.util.Iterator; import java.util.NoSuchElementException; /** Класс для преобразования лямбды в iterable: * - лямбда будет вызываться до тех пор, пока не будет возвращён sentinel * */ public class IterableOnceFromLambda<T, E extends Exception> implements Iterable<T> { private final CheckedConsumer<T, E> supplier; private final T sentinel; public IterableOnceFromLambda(CheckedConsumer<T, E> supplier, T sentinel) { this.supplier = supplier; this.sentinel = sentinel; } @Override public Iterator<T> iterator() { return new IterableOnceFromLambdaIterator<>(this); } private class IterableOnceFromLambdaIterator<T, E extends Exception> implements Iterator<T>{ /** iterable для доступа к его атрибутам */ private final IterableOnceFromLambda<T, E> iterable; /** Закончился ли итератор: достигли ли мы sentinel'а */ private boolean isEnded = false; /** Текущий элемент */ T current; /** Обработан ли текущий элемент, то есть возвращен ли он из next() */ boolean isCurrentHandled = true; public IterableOnceFromLambdaIterator(IterableOnceFromLambda<T, E> iterable) { this.iterable = iterable; } /** Метод написан для возможности * - вызывать next() без вызова getNext() * - вызывать getNext() несколько раз подряд * * Пытаемся вызвать лямбду, пока не встретим sentinel. * После этого прекращаем запрашивать у лямбды новые значения. */ private void tryGetNext() { if (isEnded || !isCurrentHandled) return; try { current = iterable.supplier.get(); isCurrentHandled = false; } catch (Exception e) { throw new RuntimeException(e); } if (current == iterable.sentinel || current.equals(iterable.sentinel)) { isEnded = true; } } @Override public boolean hasNext() { tryGetNext(); return !isEnded; } @Override public T next() { if (!hasNext()) throw new NoSuchElementException(); isCurrentHandled = true; return current; } } }