001package org.openstreetmap.josm.tools; 002 003import java.util.Collection; 004import java.util.Objects; 005import java.util.regex.Pattern; 006 007import org.openstreetmap.josm.data.osm.OsmPrimitive; 008 009/** 010 * Utility class for creating {@link Predicate}s. 011 */ 012public final class Predicates { 013 014 private Predicates() { 015 } 016 017 /** 018 * Returns the negation of {@code predicate}. 019 */ 020 public static <T> Predicate<T> not(final Predicate<T> predicate) { 021 return new Predicate<T>() { 022 @Override 023 public boolean evaluate(T obj) { 024 return !predicate.evaluate(obj); 025 } 026 }; 027 } 028 029 /** 030 * Returns a {@link Predicate} executing {@link Objects#equals}. 031 */ 032 public static <T> Predicate<T> equalTo(final T ref) { 033 return new Predicate<T>() { 034 @Override 035 public boolean evaluate(T obj) { 036 return Objects.equals(obj, ref); 037 } 038 }; 039 } 040 041 /** 042 * Returns a {@link Predicate} executing {@link Pattern#matcher(CharSequence)} and {@link java.util.regex.Matcher#matches}. 043 */ 044 public static Predicate<String> stringMatchesPattern(final Pattern pattern) { 045 return new Predicate<String>() { 046 @Override 047 public boolean evaluate(String string) { 048 return pattern.matcher(string).matches(); 049 } 050 }; 051 } 052 053 /** 054 * Returns a {@link Predicate} executing {@link Pattern#matcher(CharSequence)} and {@link java.util.regex.Matcher#find}. 055 */ 056 public static Predicate<String> stringContainsPattern(final Pattern pattern) { 057 return new Predicate<String>() { 058 @Override 059 public boolean evaluate(String string) { 060 return pattern.matcher(string).find(); 061 } 062 }; 063 } 064 065 /** 066 * Returns a {@link Predicate} executing {@link String#contains(CharSequence)}. 067 */ 068 public static Predicate<String> stringContains(final String pattern) { 069 return new Predicate<String>() { 070 @Override 071 public boolean evaluate(String string) { 072 return string.contains(pattern); 073 } 074 }; 075 } 076 077 /** 078 * Returns a {@link Predicate} executing {@link OsmPrimitive#hasTag(String, String...)}. 079 */ 080 public static Predicate<OsmPrimitive> hasTag(final String key, final String... values) { 081 return new Predicate<OsmPrimitive>() { 082 @Override 083 public boolean evaluate(OsmPrimitive p) { 084 return p.hasTag(key, values); 085 } 086 }; 087 } 088 089 /** 090 * Returns a {@link Predicate} executing {@link OsmPrimitive#hasKey(String)}. 091 */ 092 public static Predicate<OsmPrimitive> hasKey(final String key) { 093 return new Predicate<OsmPrimitive>() { 094 @Override 095 public boolean evaluate(OsmPrimitive p) { 096 return p.hasKey(key); 097 } 098 }; 099 } 100 101 /** 102 * Returns a {@link Predicate} executing {@link Collection#contains(Object)}. 103 */ 104 public static <T> Predicate<T> inCollection(final Collection<? extends T> target) { 105 return new Predicate<T>() { 106 @Override 107 public boolean evaluate(T object) { 108 return target.contains(object); 109 } 110 }; 111 } 112 113 /** 114 * Returns a {@link Predicate} testing whether objects are {@code null}. 115 */ 116 public static <T> Predicate<T> isNull() { 117 return new Predicate<T>() { 118 @Override 119 public boolean evaluate(T object) { 120 return object == null; 121 } 122 }; 123 } 124}