package com.revolsys.predicate; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.function.Consumer; import java.util.function.Predicate; import com.revolsys.collection.CollectionUtil; import com.revolsys.util.Property; public interface Predicates { static <T> boolean add(final Collection<T> collection, final T value, final Predicate<? super T> filter) { if (filter == null) { return collection.add(value); } else { if (filter.test(value)) { return collection.add(value); } else { return false; } } } static <T> void addAll(final Collection<T> collection, final Iterable<T> values, final Predicate<? super T> filter) { if (filter == null) { CollectionUtil.addAll(collection, values); } else { for (final T value : values) { if (filter.test(value)) { collection.add(value); } } } } static <T> Predicate<T> all() { return (t) -> { return true; }; } static <T> AndPredicate<T> and(final Iterable<Predicate<T>> filters) { return new AndPredicate<>(filters); } @SuppressWarnings("unchecked") static <T> AndPredicate<T> and(final Predicate<T>... filters) { return new AndPredicate<>(filters); } static <V> int count(final Collection<V> values, final Predicate<? super V> filter) { if (Property.isEmpty(values)) { return 0; } else if (Property.isEmpty(filter)) { return values.size(); } else { int count = 0; for (final V value : values) { if (filter.test(value)) { count++; } } return count; } } static <V> int count(final Iterable<V> values, final Predicate<? super V> filter) { int count = 0; for (final V value : values) { if (filter.test(value)) { count++; } } return count; } static <T> List<T> filter(final Iterable<T> collection, final Predicate<? super T> filter) { final List<T> list = new ArrayList<>(); addAll(list, collection, filter); return list; } static <T> List<T> filterAndRemove(final Collection<T> collection, final Predicate<? super T> filter) { final List<T> list = new ArrayList<>(); final Iterator<T> iterator = collection.iterator(); while (iterator.hasNext()) { final T object = iterator.next(); if (filter.test(object)) { iterator.remove(); list.add(object); } } return list; } static <T> boolean matches(final List<T> objects, final Predicate<? super T> filter) { for (final T object : objects) { if (filter.test(object)) { return true; } } return false; } static <T> boolean matches(final Predicate<? super T> filter, final T object) { if (filter == null) { return true; } else { if (filter.test(object)) { return true; } else { return false; } } } static <T> Consumer<? super T> newConsumer(final Predicate<? super T> filter, final Consumer<? super T> consumer) { if (filter == null) { return consumer; } else { return (value) -> { if (filter.test(value)) { consumer.accept(value); } }; } } static <T> Predicate<T> none() { return (t) -> { return false; }; } @SuppressWarnings("unchecked") static <T> OrPredicate<T> or(final Predicate<T>... filters) { return new OrPredicate<>(filters); } static <T> void remove(final Collection<T> collection, final Predicate<? super T> filter) { final Iterator<T> iterator = collection.iterator(); while (iterator.hasNext()) { final T value = iterator.next(); if (filter.test(value)) { iterator.remove(); } } } static <T> void retain(final Collection<T> collection, final Predicate<? super T> filter) { final Iterator<T> iterator = collection.iterator(); while (iterator.hasNext()) { final T value = iterator.next(); if (!filter.test(value)) { iterator.remove(); } } } static <V> boolean test(final Predicate<? super V> filter, final V value) { if (filter == null) { return true; } else { return filter.test(value); } } }