diff --git a/Task_A/src/Enumerable.java b/Task_A/src/Enumerable.java index 177bce922b7d0268b8951c08ba5690c36647aeb1..1385e4f0d062fa4ff7fc7877c59f8d3d385816e8 100644 --- a/Task_A/src/Enumerable.java +++ b/Task_A/src/Enumerable.java @@ -6,14 +6,17 @@ import java.util.Iterator; public class Enumerable<T> implements Iterable<T> { private Iterator<T> iterator; + private Collection<T> collection; public Enumerable(Collection<T> collection) { this.iterator = collection.iterator(); + this.collection = collection; } Enumerable<T> where(IPredicate<T> predicate) { - Iterator<T> oldIterator = iterator; - this.iterator = new Iterator<T>() { + Enumerable<T> enumerable = new Enumerable<>(this.collection); + Iterator<T> oldIterator = enumerable.iterator(); + enumerable.iterator = new Iterator<T>() { @Override public boolean hasNext() { @@ -26,10 +29,13 @@ public class Enumerable<T> implements Iterable<T> { while (oldIterator.hasNext() && !predicate.accept(item)) { item = oldIterator.next(); } - return item; + if (predicate.accept(item)) { + return item; + } + return null; } }; - return this; + return enumerable; } @Override @@ -40,8 +46,9 @@ public class Enumerable<T> implements Iterable<T> { void forEach(IAction<T> action) { while (iterator.hasNext()) { T t = (T) iterator.next(); - action.perform(t); + if (t != null) { + action.perform(t); + } } } - }