package com.annimon.stream.operator; import com.annimon.stream.function.Predicate; import java.util.Iterator; import java.util.NoSuchElementException; public class ObjFilter<T> implements Iterator<T> { private final Iterator<? extends T> iterator; private final Predicate<? super T> predicate; private boolean hasNext, hasNextEvaluated; private T next; public ObjFilter(Iterator<? extends T> iterator, Predicate<? super T> predicate) { this.iterator = iterator; this.predicate = predicate; } @Override public boolean hasNext() { if (!hasNextEvaluated) { nextIteration(); hasNextEvaluated = true; } return hasNext; } @Override public T next() { if (!hasNextEvaluated) { hasNext = hasNext(); } if (!hasNext) { throw new NoSuchElementException(); } hasNextEvaluated = false; return next; } private void nextIteration() { while (iterator.hasNext()) { next = iterator.next(); if (predicate.test(next)) { hasNext = true; return; } } hasNext = false; } @Override public void remove() { throw new UnsupportedOperationException("remove not supported"); } }