![JAR search and dependency download from the Maven repository](/logo.png)
javadoc.src-html.com.google.common.base.Predicates.html Maven / Gradle / Ivy
The newest version!
001 /*
002 * Copyright (C) 2007 The Guava Authors
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016
017 package com.google.common.base;
018
019 import static com.google.common.base.Preconditions.checkNotNull;
020
021 import com.google.common.annotations.Beta;
022 import com.google.common.annotations.GwtCompatible;
023 import com.google.common.annotations.GwtIncompatible;
024
025 import java.io.Serializable;
026 import java.util.ArrayList;
027 import java.util.Arrays;
028 import java.util.Collection;
029 import java.util.List;
030 import java.util.regex.Pattern;
031
032 import javax.annotation.Nullable;
033
034 /**
035 * Static utility methods pertaining to {@code Predicate} instances.
036 *
037 * <p>All methods returns serializable predicates as long as they're given
038 * serializable parameters.
039 *
040 * @author Kevin Bourrillion
041 * @since 2.0 (imported from Google Collections Library)
042 */
043 @GwtCompatible(emulated = true)
044 public final class Predicates {
045 private Predicates() {}
046
047 // TODO(kevinb): considering having these implement a VisitablePredicate
048 // interface which specifies an accept(PredicateVisitor) method.
049
050 /**
051 * Returns a predicate that always evaluates to {@code true}.
052 */
053 @GwtCompatible(serializable = true)
054 public static <T> Predicate<T> alwaysTrue() {
055 return ObjectPredicate.ALWAYS_TRUE.withNarrowedType();
056 }
057
058 /**
059 * Returns a predicate that always evaluates to {@code false}.
060 */
061 @GwtCompatible(serializable = true)
062 public static <T> Predicate<T> alwaysFalse() {
063 return ObjectPredicate.ALWAYS_FALSE.withNarrowedType();
064 }
065
066 /**
067 * Returns a predicate that evaluates to {@code true} if the object reference
068 * being tested is null.
069 */
070 @GwtCompatible(serializable = true)
071 public static <T> Predicate<T> isNull() {
072 return ObjectPredicate.IS_NULL.withNarrowedType();
073 }
074
075 /**
076 * Returns a predicate that evaluates to {@code true} if the object reference
077 * being tested is not null.
078 */
079 @GwtCompatible(serializable = true)
080 public static <T> Predicate<T> notNull() {
081 return ObjectPredicate.NOT_NULL.withNarrowedType();
082 }
083
084 /**
085 * Returns a predicate that evaluates to {@code true} if the given predicate
086 * evaluates to {@code false}.
087 */
088 public static <T> Predicate<T> not(Predicate<T> predicate) {
089 return new NotPredicate<T>(predicate);
090 }
091
092 /**
093 * Returns a predicate that evaluates to {@code true} if each of its
094 * components evaluates to {@code true}. The components are evaluated in
095 * order, and evaluation will be "short-circuited" as soon as a false
096 * predicate is found. It defensively copies the iterable passed in, so future
097 * changes to it won't alter the behavior of this predicate. If {@code
098 * components} is empty, the returned predicate will always evaluate to {@code
099 * true}.
100 */
101 public static <T> Predicate<T> and(
102 Iterable<? extends Predicate<? super T>> components) {
103 return new AndPredicate<T>(defensiveCopy(components));
104 }
105
106 /**
107 * Returns a predicate that evaluates to {@code true} if each of its
108 * components evaluates to {@code true}. The components are evaluated in
109 * order, and evaluation will be "short-circuited" as soon as a false
110 * predicate is found. It defensively copies the array passed in, so future
111 * changes to it won't alter the behavior of this predicate. If {@code
112 * components} is empty, the returned predicate will always evaluate to {@code
113 * true}.
114 */
115 public static <T> Predicate<T> and(Predicate<? super T>... components) {
116 return new AndPredicate<T>(defensiveCopy(components));
117 }
118
119 /**
120 * Returns a predicate that evaluates to {@code true} if both of its
121 * components evaluate to {@code true}. The components are evaluated in
122 * order, and evaluation will be "short-circuited" as soon as a false
123 * predicate is found.
124 */
125 public static <T> Predicate<T> and(Predicate<? super T> first,
126 Predicate<? super T> second) {
127 return new AndPredicate<T>(Predicates.<T>asList(
128 checkNotNull(first), checkNotNull(second)));
129 }
130
131 /**
132 * Returns a predicate that evaluates to {@code true} if any one of its
133 * components evaluates to {@code true}. The components are evaluated in
134 * order, and evaluation will be "short-circuited" as soon as a
135 * true predicate is found. It defensively copies the iterable passed in, so
136 * future changes to it won't alter the behavior of this predicate. If {@code
137 * components} is empty, the returned predicate will always evaluate to {@code
138 * false}.
139 */
140 public static <T> Predicate<T> or(
141 Iterable<? extends Predicate<? super T>> components) {
142 return new OrPredicate<T>(defensiveCopy(components));
143 }
144
145 /**
146 * Returns a predicate that evaluates to {@code true} if any one of its
147 * components evaluates to {@code true}. The components are evaluated in
148 * order, and evaluation will be "short-circuited" as soon as a
149 * true predicate is found. It defensively copies the array passed in, so
150 * future changes to it won't alter the behavior of this predicate. If {@code
151 * components} is empty, the returned predicate will always evaluate to {@code
152 * false}.
153 */
154 public static <T> Predicate<T> or(Predicate<? super T>... components) {
155 return new OrPredicate<T>(defensiveCopy(components));
156 }
157
158 /**
159 * Returns a predicate that evaluates to {@code true} if either of its
160 * components evaluates to {@code true}. The components are evaluated in
161 * order, and evaluation will be "short-circuited" as soon as a
162 * true predicate is found.
163 */
164 public static <T> Predicate<T> or(
165 Predicate<? super T> first, Predicate<? super T> second) {
166 return new OrPredicate<T>(Predicates.<T>asList(
167 checkNotNull(first), checkNotNull(second)));
168 }
169
170 /**
171 * Returns a predicate that evaluates to {@code true} if the object being
172 * tested {@code equals()} the given target or both are null.
173 */
174 public static <T> Predicate<T> equalTo(@Nullable T target) {
175 return (target == null)
176 ? Predicates.<T>isNull()
177 : new IsEqualToPredicate<T>(target);
178 }
179
180 /**
181 * Returns a predicate that evaluates to {@code true} if the object being
182 * tested is an instance of the given class. If the object being tested
183 * is {@code null} this predicate evaluates to {@code false}.
184 *
185 * <p>If you want to filter an {@code Iterable} to narrow its type, consider
186 * using {@link com.google.common.collect.Iterables#filter(Iterable, Class)}
187 * in preference.
188 *
189 * <p><b>Warning:</b> contrary to the typical assumptions about predicates (as
190 * documented at {@link Predicate#apply}), the returned predicate may not be
191 * <i>consistent with equals</i>. For example, {@code
192 * instanceOf(ArrayList.class)} will yield different results for the two equal
193 * instances {@code Lists.newArrayList(1)} and {@code Arrays.asList(1)}.
194 */
195 @GwtIncompatible("Class.isInstance")
196 public static Predicate<Object> instanceOf(Class<?> clazz) {
197 return new InstanceOfPredicate(clazz);
198 }
199
200 /**
201 * Returns a predicate that evaluates to {@code true} if the class being
202 * tested is assignable from the given class. The returned predicate
203 * does not allow null inputs.
204 *
205 * @since 10.0
206 */
207 @GwtIncompatible("Class.isAssignableFrom")
208 @Beta
209 public static Predicate<Class<?>> assignableFrom(Class<?> clazz) {
210 return new AssignableFromPredicate(clazz);
211 }
212
213 /**
214 * Returns a predicate that evaluates to {@code true} if the object reference
215 * being tested is a member of the given collection. It does not defensively
216 * copy the collection passed in, so future changes to it will alter the
217 * behavior of the predicate.
218 *
219 * <p>This method can technically accept any {@code Collection<?>}, but using
220 * a typed collection helps prevent bugs. This approach doesn't block any
221 * potential users since it is always possible to use {@code
222 * Predicates.<Object>in()}.
223 *
224 * @param target the collection that may contain the function input
225 */
226 public static <T> Predicate<T> in(Collection<? extends T> target) {
227 return new InPredicate<T>(target);
228 }
229
230 /**
231 * Returns the composition of a function and a predicate. For every {@code x},
232 * the generated predicate returns {@code predicate(function(x))}.
233 *
234 * @return the composition of the provided function and predicate
235 */
236 public static <A, B> Predicate<A> compose(
237 Predicate<B> predicate, Function<A, ? extends B> function) {
238 return new CompositionPredicate<A, B>(predicate, function);
239 }
240
241 /**
242 * Returns a predicate that evaluates to {@code true} if the
243 * {@code CharSequence} being tested contains any match for the given
244 * regular expression pattern. The test used is equivalent to
245 * {@code Pattern.compile(pattern).matcher(arg).find()}
246 *
247 * @throws java.util.regex.PatternSyntaxException if the pattern is invalid
248 * @since 3.0
249 */
250 @GwtIncompatible(value = "java.util.regex.Pattern")
251 public static Predicate<CharSequence> containsPattern(String pattern) {
252 return new ContainsPatternPredicate(pattern);
253 }
254
255 /**
256 * Returns a predicate that evaluates to {@code true} if the
257 * {@code CharSequence} being tested contains any match for the given
258 * regular expression pattern. The test used is equivalent to
259 * {@code pattern.matcher(arg).find()}
260 *
261 * @since 3.0
262 */
263 @GwtIncompatible(value = "java.util.regex.Pattern")
264 public static Predicate<CharSequence> contains(Pattern pattern) {
265 return new ContainsPatternPredicate(pattern);
266 }
267
268 // End public API, begin private implementation classes.
269
270 // Package private for GWT serialization.
271 enum ObjectPredicate implements Predicate<Object> {
272 ALWAYS_TRUE {
273 @Override public boolean apply(@Nullable Object o) {
274 return true;
275 }
276 },
277 ALWAYS_FALSE {
278 @Override public boolean apply(@Nullable Object o) {
279 return false;
280 }
281 },
282 IS_NULL {
283 @Override public boolean apply(@Nullable Object o) {
284 return o == null;
285 }
286 },
287 NOT_NULL {
288 @Override public boolean apply(@Nullable Object o) {
289 return o != null;
290 }
291 };
292
293 @SuppressWarnings("unchecked") // these Object predicates work for any T
294 <T> Predicate<T> withNarrowedType() {
295 return (Predicate<T>) this;
296 }
297 }
298
299 /** @see Predicates#not(Predicate) */
300 private static class NotPredicate<T> implements Predicate<T>, Serializable {
301 final Predicate<T> predicate;
302
303 NotPredicate(Predicate<T> predicate) {
304 this.predicate = checkNotNull(predicate);
305 }
306 @Override
307 public boolean apply(T t) {
308 return !predicate.apply(t);
309 }
310 @Override public int hashCode() {
311 return ~predicate.hashCode();
312 }
313 @Override public boolean equals(@Nullable Object obj) {
314 if (obj instanceof NotPredicate) {
315 NotPredicate<?> that = (NotPredicate<?>) obj;
316 return predicate.equals(that.predicate);
317 }
318 return false;
319 }
320 @Override public String toString() {
321 return "Not(" + predicate.toString() + ")";
322 }
323 private static final long serialVersionUID = 0;
324 }
325
326 private static final Joiner COMMA_JOINER = Joiner.on(",");
327
328 /** @see Predicates#and(Iterable) */
329 private static class AndPredicate<T> implements Predicate<T>, Serializable {
330 private final List<? extends Predicate<? super T>> components;
331
332 private AndPredicate(List<? extends Predicate<? super T>> components) {
333 this.components = components;
334 }
335 @Override
336 public boolean apply(T t) {
337 for (int i = 0; i < components.size(); i++) {
338 if (!components.get(i).apply(t)) {
339 return false;
340 }
341 }
342 return true;
343 }
344 @Override public int hashCode() {
345 // 0x12472c2c is a random number to help avoid collisions with OrPredicate
346 return components.hashCode() + 0x12472c2c;
347 }
348 @Override public boolean equals(@Nullable Object obj) {
349 if (obj instanceof AndPredicate) {
350 AndPredicate<?> that = (AndPredicate<?>) obj;
351 return components.equals(that.components);
352 }
353 return false;
354 }
355 @Override public String toString() {
356 return "And(" + COMMA_JOINER.join(components) + ")";
357 }
358 private static final long serialVersionUID = 0;
359 }
360
361 /** @see Predicates#or(Iterable) */
362 private static class OrPredicate<T> implements Predicate<T>, Serializable {
363 private final List<? extends Predicate<? super T>> components;
364
365 private OrPredicate(List<? extends Predicate<? super T>> components) {
366 this.components = components;
367 }
368 @Override
369 public boolean apply(T t) {
370 for (int i = 0; i < components.size(); i++) {
371 if (components.get(i).apply(t)) {
372 return true;
373 }
374 }
375 return false;
376 }
377 @Override public int hashCode() {
378 // 0x053c91cf is a random number to help avoid collisions with AndPredicate
379 return components.hashCode() + 0x053c91cf;
380 }
381 @Override public boolean equals(@Nullable Object obj) {
382 if (obj instanceof OrPredicate) {
383 OrPredicate<?> that = (OrPredicate<?>) obj;
384 return components.equals(that.components);
385 }
386 return false;
387 }
388 @Override public String toString() {
389 return "Or(" + COMMA_JOINER.join(components) + ")";
390 }
391 private static final long serialVersionUID = 0;
392 }
393
394 /** @see Predicates#equalTo(Object) */
395 private static class IsEqualToPredicate<T>
396 implements Predicate<T>, Serializable {
397 private final T target;
398
399 private IsEqualToPredicate(T target) {
400 this.target = target;
401 }
402 @Override
403 public boolean apply(T t) {
404 return target.equals(t);
405 }
406 @Override public int hashCode() {
407 return target.hashCode();
408 }
409 @Override public boolean equals(@Nullable Object obj) {
410 if (obj instanceof IsEqualToPredicate) {
411 IsEqualToPredicate<?> that = (IsEqualToPredicate<?>) obj;
412 return target.equals(that.target);
413 }
414 return false;
415 }
416 @Override public String toString() {
417 return "IsEqualTo(" + target + ")";
418 }
419 private static final long serialVersionUID = 0;
420 }
421
422 /** @see Predicates#instanceOf(Class) */
423 @GwtIncompatible("Class.isInstance")
424 private static class InstanceOfPredicate
425 implements Predicate<Object>, Serializable {
426 private final Class<?> clazz;
427
428 private InstanceOfPredicate(Class<?> clazz) {
429 this.clazz = checkNotNull(clazz);
430 }
431 @Override
432 public boolean apply(@Nullable Object o) {
433 return clazz.isInstance(o);
434 }
435 @Override public int hashCode() {
436 return clazz.hashCode();
437 }
438 @Override public boolean equals(@Nullable Object obj) {
439 if (obj instanceof InstanceOfPredicate) {
440 InstanceOfPredicate that = (InstanceOfPredicate) obj;
441 return clazz == that.clazz;
442 }
443 return false;
444 }
445 @Override public String toString() {
446 return "IsInstanceOf(" + clazz.getName() + ")";
447 }
448 private static final long serialVersionUID = 0;
449 }
450
451 /** @see Predicates#assignableFrom(Class) */
452 @GwtIncompatible("Class.isAssignableFrom")
453 private static class AssignableFromPredicate
454 implements Predicate<Class<?>>, Serializable {
455 private final Class<?> clazz;
456
457 private AssignableFromPredicate(Class<?> clazz) {
458 this.clazz = checkNotNull(clazz);
459 }
460 @Override
461 public boolean apply(Class<?> input) {
462 return clazz.isAssignableFrom(input);
463 }
464 @Override public int hashCode() {
465 return clazz.hashCode();
466 }
467 @Override public boolean equals(@Nullable Object obj) {
468 if (obj instanceof AssignableFromPredicate) {
469 AssignableFromPredicate that = (AssignableFromPredicate) obj;
470 return clazz == that.clazz;
471 }
472 return false;
473 }
474 @Override public String toString() {
475 return "IsAssignableFrom(" + clazz.getName() + ")";
476 }
477 private static final long serialVersionUID = 0;
478 }
479
480 /** @see Predicates#in(Collection) */
481 private static class InPredicate<T> implements Predicate<T>, Serializable {
482 private final Collection<?> target;
483
484 private InPredicate(Collection<?> target) {
485 this.target = checkNotNull(target);
486 }
487
488 @Override
489 public boolean apply(T t) {
490 try {
491 return target.contains(t);
492 } catch (NullPointerException e) {
493 return false;
494 } catch (ClassCastException e) {
495 return false;
496 }
497 }
498
499 @Override public boolean equals(@Nullable Object obj) {
500 if (obj instanceof InPredicate) {
501 InPredicate<?> that = (InPredicate<?>) obj;
502 return target.equals(that.target);
503 }
504 return false;
505 }
506
507 @Override public int hashCode() {
508 return target.hashCode();
509 }
510
511 @Override public String toString() {
512 return "In(" + target + ")";
513 }
514 private static final long serialVersionUID = 0;
515 }
516
517 /** @see Predicates#compose(Predicate, Function) */
518 private static class CompositionPredicate<A, B>
519 implements Predicate<A>, Serializable {
520 final Predicate<B> p;
521 final Function<A, ? extends B> f;
522
523 private CompositionPredicate(Predicate<B> p, Function<A, ? extends B> f) {
524 this.p = checkNotNull(p);
525 this.f = checkNotNull(f);
526 }
527
528 @Override
529 public boolean apply(A a) {
530 return p.apply(f.apply(a));
531 }
532
533 @Override public boolean equals(@Nullable Object obj) {
534 if (obj instanceof CompositionPredicate) {
535 CompositionPredicate<?, ?> that = (CompositionPredicate<?, ?>) obj;
536 return f.equals(that.f) && p.equals(that.p);
537 }
538 return false;
539 }
540
541 @Override public int hashCode() {
542 return f.hashCode() ^ p.hashCode();
543 }
544
545 @Override public String toString() {
546 return p.toString() + "(" + f.toString() + ")";
547 }
548
549 private static final long serialVersionUID = 0;
550 }
551
552 /**
553 * @see Predicates#contains(Pattern)
554 * @see Predicates#containsPattern(String)
555 */
556 @GwtIncompatible("Only used by other GWT-incompatible code.")
557 private static class ContainsPatternPredicate
558 implements Predicate<CharSequence>, Serializable {
559 final Pattern pattern;
560
561 ContainsPatternPredicate(Pattern pattern) {
562 this.pattern = checkNotNull(pattern);
563 }
564
565 ContainsPatternPredicate(String patternStr) {
566 this(Pattern.compile(patternStr));
567 }
568
569 @Override
570 public boolean apply(CharSequence t) {
571 return pattern.matcher(t).find();
572 }
573
574 @Override public int hashCode() {
575 // Pattern uses Object.hashCode, so we have to reach
576 // inside to build a hashCode consistent with equals.
577
578 return Objects.hashCode(pattern.pattern(), pattern.flags());
579 }
580
581 @Override public boolean equals(@Nullable Object obj) {
582 if (obj instanceof ContainsPatternPredicate) {
583 ContainsPatternPredicate that = (ContainsPatternPredicate) obj;
584
585 // Pattern uses Object (identity) equality, so we have to reach
586 // inside to compare individual fields.
587 return Objects.equal(pattern.pattern(), that.pattern.pattern())
588 && Objects.equal(pattern.flags(), that.pattern.flags());
589 }
590 return false;
591 }
592
593 @Override public String toString() {
594 return Objects.toStringHelper(this)
595 .add("pattern", pattern)
596 .add("pattern.flags", Integer.toHexString(pattern.flags()))
597 .toString();
598 }
599
600 private static final long serialVersionUID = 0;
601 }
602
603 @SuppressWarnings("unchecked")
604 private static <T> List<Predicate<? super T>> asList(
605 Predicate<? super T> first, Predicate<? super T> second) {
606 return Arrays.<Predicate<? super T>>asList(first, second);
607 }
608
609 private static <T> List<T> defensiveCopy(T... array) {
610 return defensiveCopy(Arrays.asList(array));
611 }
612
613 static <T> List<T> defensiveCopy(Iterable<T> iterable) {
614 ArrayList<T> list = new ArrayList<T>();
615 for (T element : iterable) {
616 list.add(checkNotNull(element));
617 }
618 return list;
619 }
620 }
© 2015 - 2025 Weber Informatics LLC | Privacy Policy