com.maxifier.mxcache.clean.MappingIterable Maven / Gradle / Ivy
/*
* Copyright (c) 2008-2014 Maxifier Ltd. All Rights Reserved.
*/
package com.maxifier.mxcache.clean;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import java.util.Iterator;
import java.util.NoSuchElementException;
/**
* @author Alexander Kochurov ([email protected])
*/
public abstract class MappingIterable implements Iterable {
private final Iterable iterable;
protected MappingIterable(@Nonnull Iterable iterable) {
this.iterable = iterable;
}
@Override
public Iterator iterator() {
return new MappingIterator(iterable.iterator());
}
public abstract T map(@Nullable F f);
private final class MappingIterator implements Iterator {
private final Iterator iterator;
private T next;
private MappingIterator(Iterator iterator) {
this.iterator = iterator;
}
@Override
public boolean hasNext() {
while (next == null && iterator.hasNext()) {
next = map(iterator.next());
}
return next != null;
}
@Override
public T next() {
if (!hasNext()) {
throw new NoSuchElementException();
}
T res = next;
next = null;
return res;
}
@Override
public void remove() {
iterator.remove();
}
}
@Override
public String toString() {
return iterable.toString();
}
}