package edu.ualberta.med.biobank.common.util; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; public class PredicateUtil { public static <T> Collection<T> filter(Collection<T> source, Predicate<T> predicate) { Collection<T> result = new ArrayList<T>(); filterInto(source, predicate, result); return result; } public static <T> void filterInto(Collection<T> source, Predicate<T> predicate, Collection<T> dest) { for (T element : source) { if (predicate.evaluate(element)) { dest.add(element); } } } public static <T> void filterOut(Collection<T> target, Predicate<T> predicate) { Iterator<T> it = target.iterator(); while (it.hasNext()) { if (!predicate.evaluate(it.next())) { it.remove(); } } } public static <T> Predicate<T> andPredicate(final Predicate<T> p1, final Predicate<T> p2, final Predicate<T>... pN) { return new Predicate<T>() { @Override public boolean evaluate(T type) { if (!p1.evaluate(type) || !p2.evaluate(type)) { return false; } for (Predicate<T> p : pN) { if (!p.evaluate(type)) { return false; } } return true; } }; } public static <T> Predicate<T> orPredicate(final Predicate<T> p1, final Predicate<T> p2, final Predicate<T>... pN) { return new Predicate<T>() { @Override public boolean evaluate(T type) { if (p1.evaluate(type) || p2.evaluate(type)) { return true; } for (Predicate<T> p : pN) { if (p.evaluate(type)) { return true; } } return false; } }; } public static <T> Predicate<T> notPredicate(final Predicate<T> predicate) { return new Predicate<T>() { @Override public boolean evaluate(T type) { return !predicate.evaluate(type); } }; } }