package eu.dnetlib.miscutils.collections; import java.util.*; import com.google.common.collect.Lists; import eu.dnetlib.miscutils.functional.UnaryFunction; public class FilteredCollection implements Iterable { final transient private Iterable coll; transient UnaryFunction filter; class FilterIterator implements Iterator { final transient private Iterator iter; transient T nextElement; public FilterIterator() { this.iter = coll.iterator(); scanNext(); } private void scanNext() { while (iter.hasNext()) { final T element = iter.next(); if (filter.evaluate(element)) { nextElement = element; return; } } nextElement = null; // NOPMD } @Override public boolean hasNext() { return nextElement != null; } @Override public T next() { final T res = nextElement; scanNext(); return res; } @Override public void remove() { // no operation } } /** * Static helper function, makes usage shorter. * * @param * @param coll * @param filter * @return */ public static Iterable filter(final Iterable coll, final UnaryFunction filter) { return new FilteredCollection(coll, filter); } public static Iterable filter(final X[] coll, final UnaryFunction filter) { return new FilteredCollection(coll, filter); } /** * Static helper function, makes common usage shorter. * * @param * @param * @param coll * @param mapper * @return */ public static List listFilter(final Iterable coll, final UnaryFunction filter) { return Lists.newArrayList(filter(coll, filter)); } public static List listFilter(final X[] coll, final UnaryFunction filter) { return Lists.newArrayList(filter(coll, filter)); } public FilteredCollection(final Collection coll, final UnaryFunction filter) { this.coll = coll; this.filter = filter; } public FilteredCollection(final Iterable coll, final UnaryFunction filter) { this.coll = coll; this.filter = filter; } public FilteredCollection(final T[] coll, final UnaryFunction filter) { this.coll = Lists.newArrayList(coll); this.filter = filter; } @Override public Iterator iterator() { return new FilterIterator(); } public static void main(final String[] args) { final List list = new ArrayList(); list.add("ciao"); list.add(2); list.add("bubu"); final TypeFilteredCollection filtered = new TypeFilteredCollection(list, String.class); for (final String el : filtered) System.out.println("element: " + el); // NOPMD System.out.println("ok"); // NOPMD } }