. , , , .
Iterator, :
abstract class IteratorHusk<T> implements Iterator<T>
{
@SuppressWarnings("unchecked")
protected IteratorHusk()
{
value_ = nil();
}
@SuppressWarnings("unchecked")
protected T nil()
{
return (T) NIL;
}
protected abstract T yield();
private boolean tryPop()
{
value_ = yield();
return NIL != value_;
}
@SuppressWarnings("unchecked")
private T take()
{
final T current = value_;
value_ = (T) NIL;
return current;
}
public final boolean hasNext()
{
return NIL != value_ || tryPop();
}
public final T next()
{
if (NIL == value_ && !tryPop())
{
throw new NoSuchElementException();
}
return take();
}
public void remove()
{
throw new UnsupportedOperationException();
}
private static final Object NIL = new Object();
private T value_;
}
2009 Java - , :
interface UnaryFunction<T, U>
{
T eval(U argument);
}
:
class FilteringIterator<T> extends IteratorHusk<T>
{
public FilteringIterator(Iterator<? extends T> iter,
UnaryFunction<Boolean, ? super T> pred)
{
iter_ = iter;
pred_ = pred;
}
@Override
protected T yield()
{
while (iter_.hasNext())
{
final T val = iter_.next();
if (!pred_.eval(val))
{
return val;
}
}
return nil();
}
private final Iterator<? extends T> iter_;
private final UnaryFunction<Boolean, ? super T> pred_;
}
:
public static <T>
Iterator<T> lazyFilter(UnaryFunction<Boolean, ? super T> pred,
Iterator<? extends T> source)
{
return new FilteringIterator<T>(source, pred);
}