Home | History | Annotate | Download | only in base
      1 /*
      2  * Copyright (C) 2007 The Guava Authors
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  * http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.google.common.base;
     18 
     19 import static com.google.common.base.Preconditions.checkNotNull;
     20 
     21 import com.google.common.annotations.Beta;
     22 import com.google.common.annotations.GwtCompatible;
     23 import com.google.common.annotations.GwtIncompatible;
     24 
     25 import java.io.Serializable;
     26 import java.util.ArrayList;
     27 import java.util.Arrays;
     28 import java.util.Collection;
     29 import java.util.List;
     30 import java.util.regex.Pattern;
     31 
     32 import javax.annotation.Nullable;
     33 
     34 /**
     35  * Static utility methods pertaining to {@code Predicate} instances.
     36  *
     37  * <p>All methods returns serializable predicates as long as they're given
     38  * serializable parameters.
     39  *
     40  * @author Kevin Bourrillion
     41  * @since 2.0 (imported from Google Collections Library)
     42  */
     43 @GwtCompatible(emulated = true)
     44 public final class Predicates {
     45   private Predicates() {}
     46 
     47   // TODO(kevinb): considering having these implement a VisitablePredicate
     48   // interface which specifies an accept(PredicateVisitor) method.
     49 
     50   /**
     51    * Returns a predicate that always evaluates to {@code true}.
     52    */
     53   @GwtCompatible(serializable = true)
     54   public static <T> Predicate<T> alwaysTrue() {
     55     return ObjectPredicate.ALWAYS_TRUE.withNarrowedType();
     56   }
     57 
     58   /**
     59    * Returns a predicate that always evaluates to {@code false}.
     60    */
     61   @GwtCompatible(serializable = true)
     62   public static <T> Predicate<T> alwaysFalse() {
     63     return ObjectPredicate.ALWAYS_FALSE.withNarrowedType();
     64   }
     65 
     66   /**
     67    * Returns a predicate that evaluates to {@code true} if the object reference
     68    * being tested is null.
     69    */
     70   @GwtCompatible(serializable = true)
     71   public static <T> Predicate<T> isNull() {
     72     return ObjectPredicate.IS_NULL.withNarrowedType();
     73   }
     74 
     75   /**
     76    * Returns a predicate that evaluates to {@code true} if the object reference
     77    * being tested is not null.
     78    */
     79   @GwtCompatible(serializable = true)
     80   public static <T> Predicate<T> notNull() {
     81     return ObjectPredicate.NOT_NULL.withNarrowedType();
     82   }
     83 
     84   /**
     85    * Returns a predicate that evaluates to {@code true} if the given predicate
     86    * evaluates to {@code false}.
     87    */
     88   public static <T> Predicate<T> not(Predicate<T> predicate) {
     89     return new NotPredicate<T>(predicate);
     90   }
     91 
     92   /**
     93    * Returns a predicate that evaluates to {@code true} if each of its
     94    * components evaluates to {@code true}. The components are evaluated in
     95    * order, and evaluation will be "short-circuited" as soon as a false
     96    * predicate is found. It defensively copies the iterable passed in, so future
     97    * changes to it won't alter the behavior of this predicate. If {@code
     98    * components} is empty, the returned predicate will always evaluate to {@code
     99    * 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 }
    621