// License: GPL. For details, see LICENSE file. package org.openstreetmap.josm.tools; import java.util.Collection; import java.util.Objects; import java.util.regex.Pattern; import org.openstreetmap.josm.data.osm.OsmPrimitive; /** * Utility class for creating {@link Predicate}s. */ public final class Predicates { private Predicates() { } /** * Creates a predicate that returns true every time. * @param The type of the predicate. * @return A predicate returning true * @since 10040 */ public static Predicate alwaysTrue() { return new Predicate() { @Override public boolean evaluate(T object) { return true; } }; } /** * Creates a predicate that returns false every time. * @param The type of the predicate. * @return A predicate returning false * @since 10040 */ public static Predicate alwaysFalse() { return new Predicate() { @Override public boolean evaluate(T object) { return false; } }; } /** * Returns the negation of {@code predicate}. * @param type of items * @param predicate the predicate to negate * @return the negation of {@code predicate} */ public static Predicate not(final Predicate predicate) { return new Predicate() { @Override public boolean evaluate(T obj) { return !predicate.evaluate(obj); } }; } /** * Returns a {@link Predicate} executing {@link Objects#equals}. * @param type of items * @param ref the reference object * @return a {@link Predicate} executing {@link Objects#equals} */ public static Predicate equalTo(final T ref) { return new Predicate() { @Override public boolean evaluate(T obj) { return Objects.equals(obj, ref); } }; } /** * Creates a new predicate that checks if elements are exactly of that class. * @param The predicate type. * @param clazz The class the elements must have. * @return The new predicate. * @throws IllegalArgumentException if clazz is null */ public static Predicate isOfClass(final Class clazz) { CheckParameterUtil.ensureParameterNotNull(clazz, "clazz"); return new Predicate() { @Override public boolean evaluate(T obj) { return obj != null && obj.getClass() == clazz; } }; } /** * Creates a new predicate that checks if the object is of a given class. * @param The predicate type. * @param clazz The class objects need to be of. * @return The new predicate. * @throws IllegalArgumentException if clazz is null * @since 10286 */ public static Predicate isInstanceOf(final Class clazz) { CheckParameterUtil.ensureParameterNotNull(clazz, "clazz"); return new Predicate() { @Override public boolean evaluate(T o) { return clazz.isInstance(o); } }; } /** * Returns a {@link Predicate} executing {@link Pattern#matcher(CharSequence)} and {@link java.util.regex.Matcher#matches}. * @param pattern the pattern * @return a {@link Predicate} executing {@link Pattern#matcher(CharSequence)} and {@link java.util.regex.Matcher#matches} */ public static Predicate stringMatchesPattern(final Pattern pattern) { return new Predicate() { @Override public boolean evaluate(String string) { return pattern.matcher(string).matches(); } }; } /** * Returns a {@link Predicate} executing {@link Pattern#matcher(CharSequence)} and {@link java.util.regex.Matcher#find}. * @param pattern the pattern * @return a {@link Predicate} executing {@link Pattern#matcher(CharSequence)} and {@link java.util.regex.Matcher#find} */ public static Predicate stringContainsPattern(final Pattern pattern) { return new Predicate() { @Override public boolean evaluate(String string) { return pattern.matcher(string).find(); } }; } /** * Returns a {@link Predicate} executing {@link String#contains(CharSequence)}. * @param pattern the pattern * @return a {@link Predicate} executing {@link String#contains(CharSequence)} */ public static Predicate stringContains(final String pattern) { return new Predicate() { @Override public boolean evaluate(String string) { return string.contains(pattern); } }; } /** * Returns a {@link Predicate} executing {@link OsmPrimitive#hasTag(String, String...)}. * @param key the key forming the tag * @param values one or many values forming the tag * @return a {@link Predicate} executing {@link OsmPrimitive#hasTag(String, String...)} */ public static Predicate hasTag(final String key, final String... values) { return new Predicate() { @Override public boolean evaluate(OsmPrimitive p) { return p.hasTag(key, values); } }; } /** * Returns a {@link Predicate} executing {@link OsmPrimitive#hasKey(String)}. * @param key the key * @return a {@link Predicate} executing {@link OsmPrimitive#hasKey(String)} */ public static Predicate hasKey(final String key) { return new Predicate() { @Override public boolean evaluate(OsmPrimitive p) { return p.hasKey(key); } }; } /** * Returns a {@link Predicate} executing {@link Collection#contains(Object)}. * @param type of items * @param target collection * @return a {@link Predicate} executing {@link Collection#contains(Object)} */ public static Predicate inCollection(final Collection target) { return new Predicate() { @Override public boolean evaluate(T object) { return target.contains(object); } }; } /** * Returns a {@link Predicate} testing whether objects are {@code null}. * @param type of items * @return a {@link Predicate} testing whether objects are {@code null} */ public static Predicate isNull() { return new Predicate() { @Override public boolean evaluate(T object) { return object == null; } }; } }