package nl.helixsoft.util; import java.util.ArrayList; import java.util.Iterator; import java.util.List; //TODO: check against modification during iteration? public class ChunkedIterator<T> implements Iterable<List<T>> { private final Iterable<T> delegate; private final int chunkSize; public ChunkedIterator(Iterable<T> delegate, int chunkSize) { this.delegate = delegate; this.chunkSize = chunkSize; } @Override public Iterator<List<T>> iterator() { return new Iterator <List<T>>() { private Iterator<T> it = delegate.iterator(); int pos = 0; @Override public boolean hasNext() { return it.hasNext(); } @Override public List<T> next() { if (!it.hasNext()) throw new IllegalStateException("Access beyond end of iterator"); // TODO, what exception to throw here? //TODO: more memory efficient solution is to use a sub-iterator here. List<T> result = new ArrayList<T>(); for (int i = 0; i < chunkSize; ++i) { result.add (it.next()); if (!it.hasNext()) break; } return result; } @Override public void remove() { throw new UnsupportedOperationException(); } }; } }