source: josm/trunk/src/org/openstreetmap/josm/tools/Predicates.java@ 10115

Last change on this file since 10115 was 10040, checked in by Don-vip, 8 years ago

fix #12680 - Documentation and cleanup on predicates (patch by michael2402, modified)

  • Property svn:eol-style set to native
File size: 6.1 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.tools;
3
4import java.util.Collection;
5import java.util.Objects;
6import java.util.regex.Pattern;
7
8import org.openstreetmap.josm.data.osm.OsmPrimitive;
9
10/**
11 * Utility class for creating {@link Predicate}s.
12 */
13public final class Predicates {
14
15 private Predicates() {
16 }
17
18 /**
19 * Creates a predicate that returns true every time.
20 * @param <T> The type of the predicate.
21 * @return A predicate returning <code>true</code>
22 * @since 10040
23 */
24 public static <T> Predicate<T> alwaysTrue() {
25 return new Predicate<T>() {
26 @Override
27 public boolean evaluate(T object) {
28 return true;
29 }
30 };
31 }
32
33 /**
34 * Creates a predicate that returns false every time.
35 * @param <T> The type of the predicate.
36 * @return A predicate returning <code>false</code>
37 * @since 10040
38 */
39 public static <T> Predicate<T> alwaysFalse() {
40 return new Predicate<T>() {
41 @Override
42 public boolean evaluate(T object) {
43 return false;
44 }
45 };
46 }
47
48 /**
49 * Returns the negation of {@code predicate}.
50 * @param <T> type of items
51 * @param predicate the predicate to negate
52 * @return the negation of {@code predicate}
53 */
54 public static <T> Predicate<T> not(final Predicate<T> predicate) {
55 return new Predicate<T>() {
56 @Override
57 public boolean evaluate(T obj) {
58 return !predicate.evaluate(obj);
59 }
60 };
61 }
62
63 /**
64 * Returns a {@link Predicate} executing {@link Objects#equals}.
65 * @param <T> type of items
66 * @param ref the reference object
67 * @return a {@link Predicate} executing {@link Objects#equals}
68 */
69 public static <T> Predicate<T> equalTo(final T ref) {
70 return new Predicate<T>() {
71 @Override
72 public boolean evaluate(T obj) {
73 return Objects.equals(obj, ref);
74 }
75 };
76 }
77
78 /**
79 * Creates a new predicate that checks if elements are exactly of that class.
80 * @param <T> The predicate type.
81 * @param clazz The class the elements must have.
82 * @return A predicate.
83 */
84 public static <T> Predicate<T> isOfClass(final Class<? extends T> clazz) {
85 return new Predicate<T>() {
86 @Override
87 public boolean evaluate(T obj) {
88 return obj != null && obj.getClass() == clazz;
89 }
90 };
91 }
92
93 /**
94 * Returns a {@link Predicate} executing {@link Pattern#matcher(CharSequence)} and {@link java.util.regex.Matcher#matches}.
95 * @param pattern the pattern
96 * @return a {@link Predicate} executing {@link Pattern#matcher(CharSequence)} and {@link java.util.regex.Matcher#matches}
97 */
98 public static Predicate<String> stringMatchesPattern(final Pattern pattern) {
99 return new Predicate<String>() {
100 @Override
101 public boolean evaluate(String string) {
102 return pattern.matcher(string).matches();
103 }
104 };
105 }
106
107 /**
108 * Returns a {@link Predicate} executing {@link Pattern#matcher(CharSequence)} and {@link java.util.regex.Matcher#find}.
109 * @param pattern the pattern
110 * @return a {@link Predicate} executing {@link Pattern#matcher(CharSequence)} and {@link java.util.regex.Matcher#find}
111 */
112 public static Predicate<String> stringContainsPattern(final Pattern pattern) {
113 return new Predicate<String>() {
114 @Override
115 public boolean evaluate(String string) {
116 return pattern.matcher(string).find();
117 }
118 };
119 }
120
121 /**
122 * Returns a {@link Predicate} executing {@link String#contains(CharSequence)}.
123 * @param pattern the pattern
124 * @return a {@link Predicate} executing {@link String#contains(CharSequence)}
125 */
126 public static Predicate<String> stringContains(final String pattern) {
127 return new Predicate<String>() {
128 @Override
129 public boolean evaluate(String string) {
130 return string.contains(pattern);
131 }
132 };
133 }
134
135 /**
136 * Returns a {@link Predicate} executing {@link OsmPrimitive#hasTag(String, String...)}.
137 * @param key the key forming the tag
138 * @param values one or many values forming the tag
139 * @return a {@link Predicate} executing {@link OsmPrimitive#hasTag(String, String...)}
140 */
141 public static Predicate<OsmPrimitive> hasTag(final String key, final String... values) {
142 return new Predicate<OsmPrimitive>() {
143 @Override
144 public boolean evaluate(OsmPrimitive p) {
145 return p.hasTag(key, values);
146 }
147 };
148 }
149
150 /**
151 * Returns a {@link Predicate} executing {@link OsmPrimitive#hasKey(String)}.
152 * @param key the key
153 * @return a {@link Predicate} executing {@link OsmPrimitive#hasKey(String)}
154 */
155 public static Predicate<OsmPrimitive> hasKey(final String key) {
156 return new Predicate<OsmPrimitive>() {
157 @Override
158 public boolean evaluate(OsmPrimitive p) {
159 return p.hasKey(key);
160 }
161 };
162 }
163
164 /**
165 * Returns a {@link Predicate} executing {@link Collection#contains(Object)}.
166 * @param <T> type of items
167 * @param target collection
168 * @return a {@link Predicate} executing {@link Collection#contains(Object)}
169 */
170 public static <T> Predicate<T> inCollection(final Collection<? extends T> target) {
171 return new Predicate<T>() {
172 @Override
173 public boolean evaluate(T object) {
174 return target.contains(object);
175 }
176 };
177 }
178
179 /**
180 * Returns a {@link Predicate} testing whether objects are {@code null}.
181 * @param <T> type of items
182 * @return a {@link Predicate} testing whether objects are {@code null}
183 */
184 public static <T> Predicate<T> isNull() {
185 return new Predicate<T>() {
186 @Override
187 public boolean evaluate(T object) {
188 return object == null;
189 }
190 };
191 }
192}
Note: See TracBrowser for help on using the repository browser.