, , . LazyIterator:
public class LazyIterator<E extends Acceptable> implements Iterator<E> {
private final Iterator<E> iterator;
private boolean hasNext;
private E next;
public LazyIterator(Iterator<E> iterator) {
this.iterator = iterator;
iterate();
}
private void iterate() {
hasNext = false;
while (iterator.hasNext()) {
next = iterator.next();
if (next.accept()) {
hasNext = true;
break;
}
}
}
@Override public boolean hasNext() { return hasNext; }
@Override public E next() {
if (!hasNext) throw new NoSuchElementException();
E out = next;
iterate();
return out;
}
@Override public void remove() { throw new RuntimeException("N/A"); }
}
LazyIterable
public class LazyIterable<E extends Acceptable> implements Iterable<E> {
private final Iterable<E> wrapped;
public LazyIterable(Iterable<E> wrapped) {
this.wrapped = wrapped;
}
@Override
public Iterator<E> iterator() {
return new LazyIterator<E>(wrapped.iterator());
}
}
.