ConsumingIterator.java (1268B)
1 package osm.common; 2 3 import java.util.Iterator; 4 import java.util.function.Consumer; 5 import java.util.function.Predicate; 6 7 public class ConsumingIterator<T> implements Iterator<T> { 8 private final Iterator<T> original; 9 private final Predicate<T> consumeWhere; 10 private final Consumer<T> consumer; 11 12 private T next = null; 13 14 public ConsumingIterator(Iterator<T> original, Predicate<T> consumeWhere, Consumer<T> consumer) { 15 this.original = original; 16 this.consumeWhere = consumeWhere; 17 this.consumer = consumer; 18 } 19 20 public ConsumingIterator(Iterator<T> original, Predicate<T> consumeWhere) { 21 this.original = original; 22 this.consumeWhere = consumeWhere; 23 this.consumer = null; 24 } 25 26 @Override 27 public boolean hasNext() { 28 if (next != null) 29 return true; 30 31 while (original.hasNext()) { 32 next = original.next(); 33 if (!consumeWhere.test(next)) 34 return true; 35 36 if (consumer != null) 37 consumer.accept(next); 38 } 39 return false; 40 } 41 42 @Override 43 public T next() { 44 if (!hasNext()) 45 return null; 46 47 T willNext = next; 48 next = null; 49 return willNext; 50 } 51 }