persolijn

an efficient router for busses
Log | Files | Refs

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 }