Skip to content
Snippets Groups Projects
Commit 1ddc268f authored by nikgr117's avatar nikgr117
Browse files

Make where-method non-destructive

parent 1fafabff
Branches
No related tags found
No related merge requests found
...@@ -6,30 +6,37 @@ import java.util.Iterator; ...@@ -6,30 +6,37 @@ import java.util.Iterator;
public class Enumerable<T> implements Iterable<T> { public class Enumerable<T> implements Iterable<T> {
private Iterator<T> iterator; private Iterator<T> iterator;
private Collection<T> collection;
public Enumerable(Collection<T> collection) { public Enumerable(Collection<T> collection) {
this.collection = collection;
this.iterator = collection.iterator(); this.iterator = collection.iterator();
} }
Enumerable<T> where(IPredicate<T> predicate) { Enumerable<T> where(IPredicate<T> predicate) {
Iterator<T> oldIterator = iterator; Enumerable<T> enumerable = new Enumerable<T>(this.collection);
this.iterator = new Iterator<T>() {
enumerable.iterator = new Iterator<T>() {
Iterator<T> iterator = enumerable.iterator();
@Override @Override
public boolean hasNext() { public boolean hasNext() {
return oldIterator.hasNext(); return iterator.hasNext();
} }
@Override @Override
public T next() { public T next() {
T item = oldIterator.hasNext() ? oldIterator.next() : null; T item = iterator.hasNext() ? iterator.next() : null;
while (oldIterator.hasNext() && !predicate.accept(item)) {
item = oldIterator.next(); while (iterator.hasNext() && !predicate.accept(item)) {
item = iterator.next();
} }
return item;
return predicate.accept(item) ? item : null;
} }
}; };
return this;
return enumerable;
} }
@Override @Override
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment