1090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson/* 21d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Copyright (C) 2007 The Guava Authors 3090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 41d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Licensed under the Apache License, Version 2.0 (the "License"); 51d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * you may not use this file except in compliance with the License. 61d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * You may obtain a copy of the License at 7090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 8090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * http://www.apache.org/licenses/LICENSE-2.0 9090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 10090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * Unless required by applicable law or agreed to in writing, software 111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * distributed under the License is distributed on an "AS IS" BASIS, 121d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * See the License for the specific language governing permissions and 141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * limitations under the License. 15090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 16090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 17090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonpackage com.google.common.base; 18090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport static com.google.common.base.Preconditions.checkNotNull; 201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport com.google.common.annotations.Beta; 22090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonimport com.google.common.annotations.GwtCompatible; 23090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonimport com.google.common.annotations.GwtIncompatible; 24090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 25090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonimport java.io.Serializable; 26090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonimport java.util.ArrayList; 27090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonimport java.util.Arrays; 28090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonimport java.util.Collection; 29090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonimport java.util.List; 301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringertimport java.util.regex.Pattern; 31090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 32090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonimport javax.annotation.Nullable; 33090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 34090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson/** 351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Static utility methods pertaining to {@code Predicate} instances. 36090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 37090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * <p>All methods returns serializable predicates as long as they're given 38090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * serializable parameters. 39090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 40090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * @author Kevin Bourrillion 411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 2.0 (imported from Google Collections Library) 42090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert@GwtCompatible(emulated = true) 44090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilsonpublic final class Predicates { 45090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson private Predicates() {} 46090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // TODO(kevinb): considering having these implement a VisitablePredicate 481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // interface which specifies an accept(PredicateVisitor) method. 49090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 50090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 51090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * Returns a predicate that always evaluates to {@code true}. 52090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 53090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson @GwtCompatible(serializable = true) 54090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson public static <T> Predicate<T> alwaysTrue() { 551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return ObjectPredicate.ALWAYS_TRUE.withNarrowedType(); 56090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 57090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 58090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 59090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * Returns a predicate that always evaluates to {@code false}. 60090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 61090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson @GwtCompatible(serializable = true) 62090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson public static <T> Predicate<T> alwaysFalse() { 631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return ObjectPredicate.ALWAYS_FALSE.withNarrowedType(); 64090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 65090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 66090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 67090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * Returns a predicate that evaluates to {@code true} if the object reference 68090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * being tested is null. 69090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @GwtCompatible(serializable = true) 71090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson public static <T> Predicate<T> isNull() { 721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return ObjectPredicate.IS_NULL.withNarrowedType(); 73090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 74090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 75090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 76090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * Returns a predicate that evaluates to {@code true} if the object reference 77090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * being tested is not null. 78090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @GwtCompatible(serializable = true) 80090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson public static <T> Predicate<T> notNull() { 811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return ObjectPredicate.NOT_NULL.withNarrowedType(); 82090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 83090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 84090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 85090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * Returns a predicate that evaluates to {@code true} if the given predicate 86090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * evaluates to {@code false}. 87090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 88090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson public static <T> Predicate<T> not(Predicate<T> predicate) { 89090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return new NotPredicate<T>(predicate); 90090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 91090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 92090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 93090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * Returns a predicate that evaluates to {@code true} if each of its 94090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * components evaluates to {@code true}. The components are evaluated in 95090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * order, and evaluation will be "short-circuited" as soon as a false 96090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * predicate is found. It defensively copies the iterable passed in, so future 97090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * changes to it won't alter the behavior of this predicate. If {@code 98090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * components} is empty, the returned predicate will always evaluate to {@code 99090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * true}. 100090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 101090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson public static <T> Predicate<T> and( 102090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson Iterable<? extends Predicate<? super T>> components) { 103090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return new AndPredicate<T>(defensiveCopy(components)); 104090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 105090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 106090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 107090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * Returns a predicate that evaluates to {@code true} if each of its 108090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * components evaluates to {@code true}. The components are evaluated in 109090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * order, and evaluation will be "short-circuited" as soon as a false 110090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * predicate is found. It defensively copies the array passed in, so future 111090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * changes to it won't alter the behavior of this predicate. If {@code 112090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * components} is empty, the returned predicate will always evaluate to {@code 113090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * true}. 114090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 115090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson public static <T> Predicate<T> and(Predicate<? super T>... components) { 116090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return new AndPredicate<T>(defensiveCopy(components)); 117090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 118090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 119090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 120090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * Returns a predicate that evaluates to {@code true} if both of its 121090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * components evaluate to {@code true}. The components are evaluated in 122090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * order, and evaluation will be "short-circuited" as soon as a false 123090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * predicate is found. 124090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 125090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson public static <T> Predicate<T> and(Predicate<? super T> first, 126090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson Predicate<? super T> second) { 127090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return new AndPredicate<T>(Predicates.<T>asList( 128090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson checkNotNull(first), checkNotNull(second))); 129090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 130090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 131090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 132090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * Returns a predicate that evaluates to {@code true} if any one of its 133090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * components evaluates to {@code true}. The components are evaluated in 1341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * order, and evaluation will be "short-circuited" as soon as a 135090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * true predicate is found. It defensively copies the iterable passed in, so 136090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * future changes to it won't alter the behavior of this predicate. If {@code 137090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * components} is empty, the returned predicate will always evaluate to {@code 138090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * false}. 139090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 140090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson public static <T> Predicate<T> or( 141090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson Iterable<? extends Predicate<? super T>> components) { 142090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return new OrPredicate<T>(defensiveCopy(components)); 143090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 144090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 145090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 146090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * Returns a predicate that evaluates to {@code true} if any one of its 147090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * components evaluates to {@code true}. The components are evaluated in 1481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * order, and evaluation will be "short-circuited" as soon as a 149090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * true predicate is found. It defensively copies the array passed in, so 150090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * future changes to it won't alter the behavior of this predicate. If {@code 151090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * components} is empty, the returned predicate will always evaluate to {@code 152090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * false}. 153090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 154090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson public static <T> Predicate<T> or(Predicate<? super T>... components) { 155090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return new OrPredicate<T>(defensiveCopy(components)); 156090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 157090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 158090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 159090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * Returns a predicate that evaluates to {@code true} if either of its 160090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * components evaluates to {@code true}. The components are evaluated in 1611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * order, and evaluation will be "short-circuited" as soon as a 162090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * true predicate is found. 163090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 1641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static <T> Predicate<T> or( 1651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert Predicate<? super T> first, Predicate<? super T> second) { 166090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return new OrPredicate<T>(Predicates.<T>asList( 167090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson checkNotNull(first), checkNotNull(second))); 168090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 169090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 170090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 171090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * Returns a predicate that evaluates to {@code true} if the object being 172090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * tested {@code equals()} the given target or both are null. 173090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 174090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson public static <T> Predicate<T> equalTo(@Nullable T target) { 175090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return (target == null) 176090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson ? Predicates.<T>isNull() 177090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson : new IsEqualToPredicate<T>(target); 178090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 179090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 180090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 181090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * Returns a predicate that evaluates to {@code true} if the object being 182090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * tested is an instance of the given class. If the object being tested 183090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * is {@code null} this predicate evaluates to {@code false}. 184090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 185090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * <p>If you want to filter an {@code Iterable} to narrow its type, consider 186090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * using {@link com.google.common.collect.Iterables#filter(Iterable, Class)} 187090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * in preference. 1881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 1891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p><b>Warning:</b> contrary to the typical assumptions about predicates (as 1901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * documented at {@link Predicate#apply}), the returned predicate may not be 1911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <i>consistent with equals</i>. For example, {@code 1921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * instanceOf(ArrayList.class)} will yield different results for the two equal 1931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * instances {@code Lists.newArrayList(1)} and {@code Arrays.asList(1)}. 194090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 195090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson @GwtIncompatible("Class.isInstance") 196090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson public static Predicate<Object> instanceOf(Class<?> clazz) { 197090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return new InstanceOfPredicate(clazz); 198090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 1991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 2011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns a predicate that evaluates to {@code true} if the class being 2021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * tested is assignable from the given class. The returned predicate 2031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * does not allow null inputs. 2041d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2051d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 10.0 2061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2071d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @GwtIncompatible("Class.isAssignableFrom") 2081d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Beta 2091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static Predicate<Class<?>> assignableFrom(Class<?> clazz) { 2101d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new AssignableFromPredicate(clazz); 2111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 212090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 213090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 214090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * Returns a predicate that evaluates to {@code true} if the object reference 215090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * being tested is a member of the given collection. It does not defensively 216090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * copy the collection passed in, so future changes to it will alter the 217090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * behavior of the predicate. 218090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 2191d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * <p>This method can technically accept any {@code Collection<?>}, but using 2201d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * a typed collection helps prevent bugs. This approach doesn't block any 2211d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * potential users since it is always possible to use {@code 2221d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Predicates.<Object>in()}. 223090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 224090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * @param target the collection that may contain the function input 225090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 226090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson public static <T> Predicate<T> in(Collection<? extends T> target) { 227090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return new InPredicate<T>(target); 228090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 229090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 230090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 231090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * Returns the composition of a function and a predicate. For every {@code x}, 232090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * the generated predicate returns {@code predicate(function(x))}. 233090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * 234090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson * @return the composition of the provided function and predicate 235090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 236090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson public static <A, B> Predicate<A> compose( 237090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson Predicate<B> predicate, Function<A, ? extends B> function) { 238090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return new CompositionPredicate<A, B>(predicate, function); 239090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 240090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 2411d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 2421d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns a predicate that evaluates to {@code true} if the 2431d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@code CharSequence} being tested contains any match for the given 2441d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * regular expression pattern. The test used is equivalent to 2451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@code Pattern.compile(pattern).matcher(arg).find()} 2461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2471d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @throws java.util.regex.PatternSyntaxException if the pattern is invalid 2481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 3.0 2491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @GwtIncompatible(value = "java.util.regex.Pattern") 2511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static Predicate<CharSequence> containsPattern(String pattern) { 2521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new ContainsPatternPredicate(pattern); 2531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 254090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 2551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** 2561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * Returns a predicate that evaluates to {@code true} if the 2571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@code CharSequence} being tested contains any match for the given 2581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * regular expression pattern. The test used is equivalent to 2591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * {@code pattern.matcher(arg).find()} 2601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * 2611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @since 3.0 2621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert */ 2631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @GwtIncompatible(value = "java.util.regex.Pattern") 2641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public static Predicate<CharSequence> contains(Pattern pattern) { 2651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return new ContainsPatternPredicate(pattern); 266090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 267090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 2681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // End public API, begin private implementation classes. 269090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 2701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Package private for GWT serialization. 2711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert enum ObjectPredicate implements Predicate<Object> { 2721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ALWAYS_TRUE { 2731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public boolean apply(@Nullable Object o) { 2741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return true; 2751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }, 2771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ALWAYS_FALSE { 2781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public boolean apply(@Nullable Object o) { 2791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return false; 2801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }, 2821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert IS_NULL { 2831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public boolean apply(@Nullable Object o) { 2841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return o == null; 2851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }, 2871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert NOT_NULL { 2881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public boolean apply(@Nullable Object o) { 2891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return o != null; 2901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 2911d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert }; 2921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 2931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @SuppressWarnings("unchecked") // these Object predicates work for any T 2941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert <T> Predicate<T> withNarrowedType() { 2951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return (Predicate<T>) this; 296090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 297090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 298090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 299090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** @see Predicates#not(Predicate) */ 3001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static class NotPredicate<T> implements Predicate<T>, Serializable { 3011d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Predicate<T> predicate; 302090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 3031d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert NotPredicate(Predicate<T> predicate) { 304090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson this.predicate = checkNotNull(predicate); 305090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 3061d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 307090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson public boolean apply(T t) { 308090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return !predicate.apply(t); 309090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 310090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson @Override public int hashCode() { 3111d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return ~predicate.hashCode(); 312090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 3131d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public boolean equals(@Nullable Object obj) { 3141d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (obj instanceof NotPredicate) { 315090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson NotPredicate<?> that = (NotPredicate<?>) obj; 316090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return predicate.equals(that.predicate); 317090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 318090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return false; 319090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 320090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson @Override public String toString() { 321090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return "Not(" + predicate.toString() + ")"; 322090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 323090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson private static final long serialVersionUID = 0; 324090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 325090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 3261d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final Joiner COMMA_JOINER = Joiner.on(","); 327090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 328090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** @see Predicates#and(Iterable) */ 3291d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static class AndPredicate<T> implements Predicate<T>, Serializable { 3301d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private final List<? extends Predicate<? super T>> components; 331090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 3321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private AndPredicate(List<? extends Predicate<? super T>> components) { 333090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson this.components = components; 334090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 3351d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 336090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson public boolean apply(T t) { 3371d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (int i = 0; i < components.size(); i++) { 3381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (!components.get(i).apply(t)) { 339090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return false; 340090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 341090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 342090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return true; 343090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 344090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson @Override public int hashCode() { 3451d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // 0x12472c2c is a random number to help avoid collisions with OrPredicate 3461d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return components.hashCode() + 0x12472c2c; 347090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 3481d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public boolean equals(@Nullable Object obj) { 3491d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (obj instanceof AndPredicate) { 350090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson AndPredicate<?> that = (AndPredicate<?>) obj; 3511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return components.equals(that.components); 352090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 353090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return false; 354090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 355090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson @Override public String toString() { 3561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return "And(" + COMMA_JOINER.join(components) + ")"; 357090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 358090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson private static final long serialVersionUID = 0; 359090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 360090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 361090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** @see Predicates#or(Iterable) */ 3621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static class OrPredicate<T> implements Predicate<T>, Serializable { 3631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private final List<? extends Predicate<? super T>> components; 364090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 3651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private OrPredicate(List<? extends Predicate<? super T>> components) { 366090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson this.components = components; 367090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 3681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 369090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson public boolean apply(T t) { 3701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert for (int i = 0; i < components.size(); i++) { 3711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (components.get(i).apply(t)) { 372090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return true; 373090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 374090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 375090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return false; 376090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 377090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson @Override public int hashCode() { 3781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // 0x053c91cf is a random number to help avoid collisions with AndPredicate 3791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return components.hashCode() + 0x053c91cf; 380090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 3811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public boolean equals(@Nullable Object obj) { 3821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (obj instanceof OrPredicate) { 383090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson OrPredicate<?> that = (OrPredicate<?>) obj; 3841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return components.equals(that.components); 385090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 386090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return false; 387090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 388090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson @Override public String toString() { 3891d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return "Or(" + COMMA_JOINER.join(components) + ")"; 390090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 391090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson private static final long serialVersionUID = 0; 392090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 393090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 394090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** @see Predicates#equalTo(Object) */ 395090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson private static class IsEqualToPredicate<T> 396090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson implements Predicate<T>, Serializable { 397090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson private final T target; 398090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 399090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson private IsEqualToPredicate(T target) { 400090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson this.target = target; 401090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 4021d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 403090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson public boolean apply(T t) { 404090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return target.equals(t); 405090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 406090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson @Override public int hashCode() { 407090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return target.hashCode(); 408090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 4091d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public boolean equals(@Nullable Object obj) { 410090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson if (obj instanceof IsEqualToPredicate) { 411090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson IsEqualToPredicate<?> that = (IsEqualToPredicate<?>) obj; 412090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return target.equals(that.target); 413090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 414090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return false; 415090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 416090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson @Override public String toString() { 417090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return "IsEqualTo(" + target + ")"; 418090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 419090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson private static final long serialVersionUID = 0; 420090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 421090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 422090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** @see Predicates#instanceOf(Class) */ 4231d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @GwtIncompatible("Class.isInstance") 424090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson private static class InstanceOfPredicate 425090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson implements Predicate<Object>, Serializable { 426090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson private final Class<?> clazz; 427090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 428090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson private InstanceOfPredicate(Class<?> clazz) { 429090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson this.clazz = checkNotNull(clazz); 430090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 4311d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 4321d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public boolean apply(@Nullable Object o) { 4331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return clazz.isInstance(o); 434090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 435090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson @Override public int hashCode() { 436090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return clazz.hashCode(); 437090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 4381d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public boolean equals(@Nullable Object obj) { 439090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson if (obj instanceof InstanceOfPredicate) { 440090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson InstanceOfPredicate that = (InstanceOfPredicate) obj; 441090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return clazz == that.clazz; 442090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 443090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return false; 444090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 445090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson @Override public String toString() { 446090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return "IsInstanceOf(" + clazz.getName() + ")"; 447090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 448090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson private static final long serialVersionUID = 0; 449090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 4501d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 4511d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert /** @see Predicates#assignableFrom(Class) */ 4521d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @GwtIncompatible("Class.isAssignableFrom") 4531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static class AssignableFromPredicate 4541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert implements Predicate<Class<?>>, Serializable { 4551d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private final Class<?> clazz; 456090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 4571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private AssignableFromPredicate(Class<?> clazz) { 4581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert this.clazz = checkNotNull(clazz); 459090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 4601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 4611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public boolean apply(Class<?> input) { 4621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return clazz.isAssignableFrom(input); 463090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 4641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public int hashCode() { 4651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return clazz.hashCode(); 4661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public boolean equals(@Nullable Object obj) { 4681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (obj instanceof AssignableFromPredicate) { 4691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert AssignableFromPredicate that = (AssignableFromPredicate) obj; 4701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return clazz == that.clazz; 4711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 4721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return false; 473090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 474090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson @Override public String toString() { 4751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return "IsAssignableFrom(" + clazz.getName() + ")"; 476090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 4771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final long serialVersionUID = 0; 478090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 479090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 480090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** @see Predicates#in(Collection) */ 4811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static class InPredicate<T> implements Predicate<T>, Serializable { 482090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson private final Collection<?> target; 483090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 484090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson private InPredicate(Collection<?> target) { 485090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson this.target = checkNotNull(target); 486090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 487090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 4881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 489090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson public boolean apply(T t) { 490090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson try { 491090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return target.contains(t); 492090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } catch (NullPointerException e) { 493090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return false; 494090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } catch (ClassCastException e) { 495090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return false; 496090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 497090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 498090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 4991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public boolean equals(@Nullable Object obj) { 5001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (obj instanceof InPredicate) { 501090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson InPredicate<?> that = (InPredicate<?>) obj; 502090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return target.equals(that.target); 503090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 504090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return false; 505090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 506090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 507090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson @Override public int hashCode() { 508090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return target.hashCode(); 509090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 510090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 511090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson @Override public String toString() { 512090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return "In(" + target + ")"; 513090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 514090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson private static final long serialVersionUID = 0; 515090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 516090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 517090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** @see Predicates#compose(Predicate, Function) */ 518090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson private static class CompositionPredicate<A, B> 519090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson implements Predicate<A>, Serializable { 520090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson final Predicate<B> p; 521090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson final Function<A, ? extends B> f; 522090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 523090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson private CompositionPredicate(Predicate<B> p, Function<A, ? extends B> f) { 524090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson this.p = checkNotNull(p); 525090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson this.f = checkNotNull(f); 526090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 527090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 5281d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 529090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson public boolean apply(A a) { 530090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return p.apply(f.apply(a)); 531090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 532090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 5331d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public boolean equals(@Nullable Object obj) { 5341d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (obj instanceof CompositionPredicate) { 535090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson CompositionPredicate<?, ?> that = (CompositionPredicate<?, ?>) obj; 536090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return f.equals(that.f) && p.equals(that.p); 537090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 538090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return false; 539090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 540090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 541090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson @Override public int hashCode() { 542090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return f.hashCode() ^ p.hashCode(); 543090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 544090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 545090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson @Override public String toString() { 546090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return p.toString() + "(" + f.toString() + ")"; 547090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 548090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 549090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson private static final long serialVersionUID = 0; 550090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 551090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 552090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson /** 5531d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @see Predicates#contains(Pattern) 5541d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert * @see Predicates#containsPattern(String) 555090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson */ 5561d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @GwtIncompatible("Only used by other GWT-incompatible code.") 5571d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static class ContainsPatternPredicate 5581d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert implements Predicate<CharSequence>, Serializable { 5591d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert final Pattern pattern; 5601d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5611d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ContainsPatternPredicate(Pattern pattern) { 5621d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert this.pattern = checkNotNull(pattern); 5631d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5641d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5651d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ContainsPatternPredicate(String patternStr) { 5661d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert this(Pattern.compile(patternStr)); 5671d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5681d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5691d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override 5701d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert public boolean apply(CharSequence t) { 5711d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return pattern.matcher(t).find(); 5721d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5731d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5741d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public int hashCode() { 5751d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Pattern uses Object.hashCode, so we have to reach 5761d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // inside to build a hashCode consistent with equals. 5771d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5781d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Objects.hashCode(pattern.pattern(), pattern.flags()); 5791d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5801d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5811d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public boolean equals(@Nullable Object obj) { 5821d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert if (obj instanceof ContainsPatternPredicate) { 5831d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert ContainsPatternPredicate that = (ContainsPatternPredicate) obj; 5841d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5851d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // Pattern uses Object (identity) equality, so we have to reach 5861d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert // inside to compare individual fields. 5871d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Objects.equal(pattern.pattern(), that.pattern.pattern()) 5881d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert && Objects.equal(pattern.flags(), that.pattern.flags()); 589090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 5901d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return false; 591090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 5921d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 5931d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert @Override public String toString() { 5941d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert return Objects.toStringHelper(this) 5951d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .add("pattern", pattern) 5961d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .add("pattern.flags", Integer.toHexString(pattern.flags())) 5971d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert .toString(); 5981d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert } 5991d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert 6001d580d0f6ee4f21eb309ba7b509d2c6d671c4044Bjorn Bringert private static final long serialVersionUID = 0; 601090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 602090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 603090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson @SuppressWarnings("unchecked") 604090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson private static <T> List<Predicate<? super T>> asList( 605090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson Predicate<? super T> first, Predicate<? super T> second) { 606090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return Arrays.<Predicate<? super T>>asList(first, second); 607090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 608090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 609090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson private static <T> List<T> defensiveCopy(T... array) { 610090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return defensiveCopy(Arrays.asList(array)); 611090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 612090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson 613090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson static <T> List<T> defensiveCopy(Iterable<T> iterable) { 614090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson ArrayList<T> list = new ArrayList<T>(); 615090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson for (T element : iterable) { 616090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson list.add(checkNotNull(element)); 617090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 618090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson return list; 619090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson } 620090f9b4c879985bc747c214f82c62471e60c7742Jesse Wilson} 621