View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.commons.collections4;
18  
19  import java.util.Collection;
20  
21  import org.apache.commons.collections4.functors.AllPredicate;
22  import org.apache.commons.collections4.functors.AndPredicate;
23  import org.apache.commons.collections4.functors.AnyPredicate;
24  import org.apache.commons.collections4.functors.EqualPredicate;
25  import org.apache.commons.collections4.functors.ExceptionPredicate;
26  import org.apache.commons.collections4.functors.FalsePredicate;
27  import org.apache.commons.collections4.functors.IdentityPredicate;
28  import org.apache.commons.collections4.functors.InstanceofPredicate;
29  import org.apache.commons.collections4.functors.InvokerTransformer;
30  import org.apache.commons.collections4.functors.NonePredicate;
31  import org.apache.commons.collections4.functors.NotNullPredicate;
32  import org.apache.commons.collections4.functors.NotPredicate;
33  import org.apache.commons.collections4.functors.NullIsExceptionPredicate;
34  import org.apache.commons.collections4.functors.NullIsFalsePredicate;
35  import org.apache.commons.collections4.functors.NullIsTruePredicate;
36  import org.apache.commons.collections4.functors.NullPredicate;
37  import org.apache.commons.collections4.functors.OnePredicate;
38  import org.apache.commons.collections4.functors.OrPredicate;
39  import org.apache.commons.collections4.functors.TransformedPredicate;
40  import org.apache.commons.collections4.functors.TransformerPredicate;
41  import org.apache.commons.collections4.functors.TruePredicate;
42  import org.apache.commons.collections4.functors.UniquePredicate;
43  
44  /**
45   * {@code PredicateUtils} provides reference implementations and utilities
46   * for the Predicate functor interface. The supplied predicates are:
47   * <ul>
48   * <li>Invoker - returns the result of a method call on the input object
49   * <li>InstanceOf - true if the object is an instanceof a class
50   * <li>Equal - true if the object equals() a specified object
51   * <li>Identity - true if the object == a specified object
52   * <li>Null - true if the object is null
53   * <li>NotNull - true if the object is not null
54   * <li>Unique - true if the object has not already been evaluated
55   * <li>And/All - true if all of the predicates are true
56   * <li>Or/Any - true if any of the predicates is true
57   * <li>Either/One - true if only one of the predicate is true
58   * <li>Neither/None - true if none of the predicates are true
59   * <li>Not - true if the predicate is false, and vice versa
60   * <li>Transformer - wraps a Transformer as a Predicate
61   * <li>True - always return true
62   * <li>False - always return false
63   * <li>Exception - always throws an exception
64   * <li>NullIsException/NullIsFalse/NullIsTrue - check for null input
65   * <li>Transformed - transforms the input before calling the predicate
66   * </ul>
67   * <p>
68   * All the supplied predicates are Serializable.
69   * </p>
70   *
71   * @since 3.0
72   */
73  public class PredicateUtils {
74  
75      /**
76       * Create a new Predicate that returns true only if all of the specified
77       * predicates are true. The predicates are checked in iterator order.
78       * If the collection of predicates is empty, then this predicate returns true.
79       *
80       * @param <T>  the type that the predicate queries
81       * @param predicates  a collection of predicates to check, may not be null
82       * @return the {@code all} predicate
83       * @throws NullPointerException if the predicates collection is null
84       * @throws NullPointerException if any predicate in the collection is null
85       * @see AllPredicate
86       */
87      public static <T> Predicate<T> allPredicate(final Collection<? extends Predicate<? super T>> predicates) {
88          return AllPredicate.allPredicate(predicates);
89      }
90  
91      /**
92       * Create a new Predicate that returns true only if all of the specified
93       * predicates are true.
94       * If the array of predicates is empty, then this predicate returns true.
95       *
96       * @param <T>  the type that the predicate queries
97       * @param predicates  an array of predicates to check, may not be null
98       * @return the {@code all} predicate
99       * @throws NullPointerException if the predicates array is null
100      * @throws NullPointerException if any predicate in the array is null
101      * @see AllPredicate
102      */
103     public static <T> Predicate<T> allPredicate(final Predicate<? super T>... predicates) {
104         return AllPredicate.allPredicate(predicates);
105     }
106 
107     /**
108      * Create a new Predicate that returns true only if both of the specified
109      * predicates are true.
110      *
111      * @param <T>  the type that the predicate queries
112      * @param predicate1  the first predicate, may not be null
113      * @param predicate2  the second predicate, may not be null
114      * @return the {@code and} predicate
115      * @throws NullPointerException if either predicate is null
116      * @see AndPredicate
117      */
118     public static <T> Predicate<T> andPredicate(final Predicate<? super T> predicate1,
119                                                 final Predicate<? super T> predicate2) {
120         return AndPredicate.andPredicate(predicate1, predicate2);
121     }
122 
123     /**
124      * Create a new Predicate that returns true if any of the specified
125      * predicates are true. The predicates are checked in iterator order.
126      * If the collection of predicates is empty, then this predicate returns false.
127      *
128      * @param <T>  the type that the predicate queries
129      * @param predicates  a collection of predicates to check, may not be null
130      * @return the {@code any} predicate
131      * @throws NullPointerException if the predicates collection is null
132      * @throws NullPointerException if any predicate in the collection is null
133      * @see AnyPredicate
134      */
135     public static <T> Predicate<T> anyPredicate(final Collection<? extends Predicate<? super T>> predicates) {
136         return AnyPredicate.anyPredicate(predicates);
137     }
138 
139     /**
140      * Create a new Predicate that returns true if any of the specified
141      * predicates are true.
142      * If the array of predicates is empty, then this predicate returns false.
143      *
144      * @param <T>  the type that the predicate queries
145      * @param predicates  an array of predicates to check, may not be null
146      * @return the {@code any} predicate
147      * @throws NullPointerException if the predicates array is null
148      * @throws NullPointerException if any predicate in the array is null
149      * @see AnyPredicate
150      */
151     public static <T> Predicate<T> anyPredicate(final Predicate<? super T>... predicates) {
152         return AnyPredicate.anyPredicate(predicates);
153     }
154 
155     /**
156      * Create a new Predicate that wraps a Transformer. The Transformer must
157      * return either {@link Boolean#TRUE} or {@link Boolean#FALSE} otherwise a
158      * PredicateException will be thrown.
159      *
160      * @param <T>  the type that the predicate queries
161      * @param transformer  the transformer to wrap, may not be null
162      * @return the transformer wrapping predicate
163      * @throws NullPointerException if the transformer is null
164      * @see TransformerPredicate
165      */
166     public static <T> Predicate<T> asPredicate(final Transformer<? super T, Boolean> transformer) {
167         return TransformerPredicate.transformerPredicate(transformer);
168     }
169 
170     /**
171      * Create a new Predicate that returns true if one, but not both, of the
172      * specified predicates are true. XOR
173      *
174      * @param <T>  the type that the predicate queries
175      * @param predicate1  the first predicate, may not be null
176      * @param predicate2  the second predicate, may not be null
177      * @return the {@code either} predicate
178      * @throws NullPointerException if either predicate is null
179      * @see OnePredicate
180      */
181     public static <T> Predicate<T> eitherPredicate(final Predicate<? super T> predicate1,
182                                                    final Predicate<? super T> predicate2) {
183         @SuppressWarnings("unchecked")
184         final Predicate<T> onePredicate = onePredicate(predicate1, predicate2);
185         return onePredicate;
186     }
187 
188     /**
189      * Creates a Predicate that checks if the input object is equal to the
190      * specified object using equals().
191      *
192      * @param <T>  the type that the predicate queries
193      * @param value  the value to compare against
194      * @return the predicate
195      * @see EqualPredicate
196      */
197     public static <T> Predicate<T> equalPredicate(final T value) {
198         return EqualPredicate.equalPredicate(value);
199     }
200 
201     /**
202      * Gets a Predicate that always throws an exception.
203      * This could be useful during testing as a placeholder.
204      *
205      * @param <T>  the type that the predicate queries
206      * @return the predicate
207      * @see ExceptionPredicate
208      */
209     public static <T> Predicate<T> exceptionPredicate() {
210         return ExceptionPredicate.exceptionPredicate();
211     }
212 
213     /**
214      * Gets a Predicate that always returns false.
215      *
216      * @param <T>  the type that the predicate queries
217      * @return the predicate
218      * @see FalsePredicate
219      */
220     public static <T> Predicate<T> falsePredicate() {
221         return FalsePredicate.falsePredicate();
222     }
223 
224     /**
225      * Creates a Predicate that checks if the input object is equal to the
226      * specified object by identity.
227      *
228      * @param <T>  the type that the predicate queries
229      * @param value  the value to compare against
230      * @return the predicate
231      * @see IdentityPredicate
232      */
233     public static <T> Predicate<T> identityPredicate(final T value) {
234         return IdentityPredicate.identityPredicate(value);
235     }
236 
237     /**
238      * Creates a Predicate that checks if the object passed in is of
239      * a particular type, using instanceof. A {@code null} input
240      * object will return {@code false}.
241      *
242      * @param type  the type to check for, may not be null
243      * @return the predicate
244      * @throws NullPointerException if the class is null
245      * @see InstanceofPredicate
246      */
247     public static Predicate<Object> instanceofPredicate(final Class<?> type) {
248         return InstanceofPredicate.instanceOfPredicate(type);
249     }
250 
251     /**
252      * Creates a Predicate that invokes a method on the input object.
253      * The method must return either a boolean or a non-null Boolean,
254      * and have no parameters. If the input object is null, a
255      * PredicateException is thrown.
256      * <p>
257      * For ePredicateUtils.invokerPredicate("isEmpty");}
258      * will call the {@code isEmpty} method on the input object to
259      * determine the predicate result.
260      *
261      * @param <T>  the type that the predicate queries
262      * @param methodName  the method name to call on the input object, may not be null
263      * @return the predicate
264      * @throws NullPointerException if the methodName is null.
265      * @see InvokerTransformer
266      * @see TransformerPredicate
267      */
268     public static <T> Predicate<T> invokerPredicate(final String methodName) {
269         // reuse transformer as it has caching - this is lazy really, should have inner class here
270         return asPredicate(InvokerTransformer.<Object, Boolean>invokerTransformer(methodName));
271     }
272 
273     /**
274      * Creates a Predicate that invokes a method on the input object.
275      * The method must return either a boolean or a non-null Boolean,
276      * and have no parameters. If the input object is null, a
277      * PredicateException is thrown.
278      * <p>
279      * For example, {@code PredicateUtils.invokerPredicate("isEmpty");}
280      * will call the {@code isEmpty} method on the input object to
281      * determine the predicate result.
282      * </p>
283      *
284      * @param <T>  the type that the predicate queries
285      * @param methodName  the method name to call on the input object, may not be null
286      * @param paramTypes  the parameter types
287      * @param args  the arguments
288      * @return the predicate
289      * @throws NullPointerException if the method name is null
290      * @throws IllegalArgumentException if the paramTypes and args don't match
291      * @see InvokerTransformer
292      * @see TransformerPredicate
293      */
294     public static <T> Predicate<T> invokerPredicate(final String methodName, final Class<?>[] paramTypes,
295                                                     final Object[] args) {
296         // reuse transformer as it has caching - this is lazy really, should have inner class here
297         return asPredicate(InvokerTransformer.<Object, Boolean>invokerTransformer(methodName, paramTypes, args));
298     }
299 
300     /**
301      * Create a new Predicate that returns true if neither of the specified
302      * predicates are true.
303      *
304      * @param <T>  the type that the predicate queries
305      * @param predicate1  the first predicate, may not be null
306      * @param predicate2  the second predicate, may not be null
307      * @return the {@code neither} predicate
308      * @throws NullPointerException if either predicate is null
309      * @see NonePredicate
310      */
311     public static <T> Predicate<T> neitherPredicate(final Predicate<? super T> predicate1,
312                                                     final Predicate<? super T> predicate2) {
313         @SuppressWarnings("unchecked")
314         final Predicate<T> nonePredicate = nonePredicate(predicate1, predicate2);
315         return nonePredicate;
316     }
317 
318     /**
319      * Create a new Predicate that returns true if none of the specified
320      * predicates are true. The predicates are checked in iterator order.
321      * If the collection of predicates is empty, then this predicate returns true.
322      *
323      * @param <T>  the type that the predicate queries
324      * @param predicates  a collection of predicates to check, may not be null
325      * @return the {@code none} predicate
326      * @throws NullPointerException if the predicates collection is null
327      * @throws NullPointerException if any predicate in the collection is null
328      * @see NonePredicate
329      */
330     public static <T> Predicate<T> nonePredicate(final Collection<? extends Predicate<? super T>> predicates) {
331         return NonePredicate.nonePredicate(predicates);
332     }
333 
334     /**
335      * Create a new Predicate that returns true if none of the specified
336      * predicates are true.
337      * If the array of predicates is empty, then this predicate returns true.
338      *
339      * @param <T>  the type that the predicate queries
340      * @param predicates  an array of predicates to check, may not be null
341      * @return the {@code none} predicate
342      * @throws NullPointerException if the predicates array is null
343      * @throws NullPointerException if any predicate in the array is null
344      * @see NonePredicate
345      */
346     public static <T> Predicate<T> nonePredicate(final Predicate<? super T>... predicates) {
347         return NonePredicate.nonePredicate(predicates);
348     }
349 
350     /**
351      * Gets a Predicate that checks if the input object passed in is not null.
352      *
353      * @param <T>  the type that the predicate queries
354      * @return the predicate
355      * @see NotNullPredicate
356      */
357     public static <T> Predicate<T> notNullPredicate() {
358         return NotNullPredicate.notNullPredicate();
359     }
360 
361     /**
362      * Create a new Predicate that returns true if the specified predicate
363      * returns false and vice versa.
364      *
365      * @param <T>  the type that the predicate queries
366      * @param predicate  the predicate to not
367      * @return the {@code not} predicate
368      * @throws NullPointerException if the predicate is null
369      * @see NotPredicate
370      */
371     public static <T> Predicate<T> notPredicate(final Predicate<? super T> predicate) {
372         return NotPredicate.notPredicate(predicate);
373     }
374 
375     /**
376      * Gets a Predicate that throws an exception if the input object is null,
377      * otherwise it calls the specified Predicate. This allows null handling
378      * behavior to be added to Predicates that don't support nulls.
379      *
380      * @param <T>  the type that the predicate queries
381      * @param predicate  the predicate to wrap, may not be null
382      * @return the predicate
383      * @throws NullPointerException if the predicate is null.
384      * @see NullIsExceptionPredicate
385      */
386     public static <T> Predicate<T> nullIsExceptionPredicate(final Predicate<? super T> predicate) {
387         return NullIsExceptionPredicate.nullIsExceptionPredicate(predicate);
388     }
389 
390     /**
391      * Gets a Predicate that returns false if the input object is null, otherwise
392      * it calls the specified Predicate. This allows null handling behavior to
393      * be added to Predicates that don't support nulls.
394      *
395      * @param <T>  the type that the predicate queries
396      * @param predicate  the predicate to wrap, may not be null
397      * @return the predicate
398      * @throws NullPointerException if the predicate is null.
399      * @see NullIsFalsePredicate
400      */
401     public static <T> Predicate<T> nullIsFalsePredicate(final Predicate<? super T> predicate) {
402         return NullIsFalsePredicate.nullIsFalsePredicate(predicate);
403     }
404 
405     /**
406      * Gets a Predicate that returns true if the input object is null, otherwise
407      * it calls the specified Predicate. This allows null handling behavior to
408      * be added to Predicates that don't support nulls.
409      *
410      * @param <T>  the type that the predicate queries
411      * @param predicate  the predicate to wrap, may not be null
412      * @return the predicate
413      * @throws NullPointerException if the predicate is null.
414      * @see NullIsTruePredicate
415      */
416     public static <T> Predicate<T> nullIsTruePredicate(final Predicate<? super T> predicate) {
417         return NullIsTruePredicate.nullIsTruePredicate(predicate);
418     }
419 
420     /**
421      * Gets a Predicate that checks if the input object passed in is null.
422      *
423      * @param <T>  the type that the predicate queries
424      * @return the predicate
425      * @see NullPredicate
426      */
427     public static <T> Predicate<T> nullPredicate() {
428         return NullPredicate.nullPredicate();
429     }
430 
431     /**
432      * Create a new Predicate that returns true if only one of the specified
433      * predicates are true. The predicates are checked in iterator order.
434      * If the collection of predicates is empty, then this predicate returns false.
435      *
436      * @param <T>  the type that the predicate queries
437      * @param predicates  a collection of predicates to check, may not be null
438      * @return the {@code one} predicate
439      * @throws NullPointerException if the predicates collection is null
440      * @throws NullPointerException if any predicate in the collection is null
441      * @see OnePredicate
442      */
443     public static <T> Predicate<T> onePredicate(final Collection<? extends Predicate<? super T>> predicates) {
444         return OnePredicate.onePredicate(predicates);
445     }
446 
447     /**
448      * Create a new Predicate that returns true if only one of the specified
449      * predicates are true.
450      * If the array of predicates is empty, then this predicate returns false.
451      *
452      * @param <T>  the type that the predicate queries
453      * @param predicates  an array of predicates to check, may not be null
454      * @return the {@code one} predicate
455      * @throws NullPointerException if the predicates array is null
456      * @throws NullPointerException if any predicate in the array is null
457      * @see OnePredicate
458      */
459     public static <T> Predicate<T> onePredicate(final Predicate<? super T>... predicates) {
460         return OnePredicate.onePredicate(predicates);
461     }
462 
463     /**
464      * Create a new Predicate that returns true if either of the specified
465      * predicates are true.
466      *
467      * @param <T>  the type that the predicate queries
468      * @param predicate1  the first predicate, may not be null
469      * @param predicate2  the second predicate, may not be null
470      * @return the {@code or} predicate
471      * @throws NullPointerException if either predicate is null
472      * @see OrPredicate
473      */
474     public static <T> Predicate<T> orPredicate(final Predicate<? super T> predicate1,
475                                                final Predicate<? super T> predicate2) {
476         return OrPredicate.orPredicate(predicate1, predicate2);
477     }
478 
479     /**
480      * Creates a predicate that transforms the input object before passing it
481      * to the predicate.
482      *
483      * @param <T>  the type that the predicate queries
484      * @param transformer  the transformer to call first
485      * @param predicate  the predicate to call with the result of the transform
486      * @return the predicate
487      * @throws NullPointerException if the transformer or the predicate is null
488      * @see TransformedPredicate
489      * @since 3.1
490      */
491     public static <T> Predicate<T> transformedPredicate(final Transformer<? super T, ? extends T> transformer, final Predicate<? super T> predicate) {
492         return TransformedPredicate.transformedPredicate(transformer, predicate);
493     }
494 
495     /**
496      * Gets a Predicate that always returns true.
497      *
498      * @param <T>  the type that the predicate queries
499      * @return the predicate
500      * @see TruePredicate
501      */
502     public static <T> Predicate<T> truePredicate() {
503         return TruePredicate.truePredicate();
504     }
505 
506     /**
507      * Creates a Predicate that returns true the first time an object is
508      * encountered, and false if the same object is received
509      * again. The comparison is by equals(). A {@code null} input object
510      * is accepted and will return true the first time, and false subsequently
511      * as well.
512      *
513      * @param <T>  the type that the predicate queries
514      * @return the predicate
515      * @see UniquePredicate
516      */
517     public static <T> Predicate<T> uniquePredicate() {
518         // must return new instance each time
519         return UniquePredicate.uniquePredicate();
520     }
521 
522     /**
523      * Don't allow instances.
524      */
525     private PredicateUtils() {
526         // empty
527     }
528 
529 }