code: public static <E> Iterator<E> filter(Iterator<E> iterator, Predicate<E> predicate) {
          return new FilteringIterator<E>(iterator, predicate);
      }
docs: Creates an iterator yielding elements from the source iterator matching
  the given predicate. This transformation is applied lazily and the
  predicate is applied while consuming returned iterator. E.g:
  <code>filter([1,2,3,4], isEven) -> [2,4]</code>
  
  @param <E> the iterator element type
  @param iterator the iterator where elements are fetched from
  @param predicate the predicate applied to each element
  @return an iterator containing the elements for which the predicate
  evaluates to true