Class ClosureUtils
- java.lang.Object
-
- org.apache.commons.collections4.ClosureUtils
-
public class ClosureUtils extends java.lang.Object
ClosureUtils
provides reference implementations and utilities for the Closure functor interface. The supplied closures are:- Invoker - invokes a method on the input object
- For - repeatedly calls a closure for a fixed number of times
- While - repeatedly calls a closure while a predicate is true
- Chained - chains two or more closures together
- If - calls one closure or another based on a predicate
- Switch - calls one closure based on one or more predicates
- SwitchMap - calls one closure looked up from a Map
- Transformer - wraps a Transformer as a Closure
- NOP - does nothing
- Exception - always throws an exception
Since v4.1 only closures which are considered to be safe are Serializable. Closures considered to be unsafe for serialization are:
- Invoker
- For
- While
- Since:
- 3.0
-
-
Method Summary
All Methods Static Methods Concrete Methods Modifier and Type Method Description static <E> Closure<E>
asClosure(Transformer<? super E,?> transformer)
Creates a Closure that calls a Transformer each time it is called.static <E> Closure<E>
chainedClosure(java.util.Collection<? extends Closure<? super E>> closures)
Create a new Closure that calls each closure in turn, passing the result into the next closure.static <E> Closure<E>
chainedClosure(Closure<? super E>... closures)
Create a new Closure that calls each closure in turn, passing the result into the next closure.static <E> Closure<E>
doWhileClosure(Closure<? super E> closure, Predicate<? super E> predicate)
Creates a Closure that will call the closure once and then repeatedly until the predicate returns false.static <E> Closure<E>
exceptionClosure()
Gets a Closure that always throws an exception.static <E> Closure<E>
forClosure(int count, Closure<? super E> closure)
Creates a Closure that will call the closurecount
times.static <E> Closure<E>
ifClosure(Predicate<? super E> predicate, Closure<? super E> trueClosure)
Create a new Closure that calls another closure based on the result of the specified predicate.static <E> Closure<E>
ifClosure(Predicate<? super E> predicate, Closure<? super E> trueClosure, Closure<? super E> falseClosure)
Create a new Closure that calls one of two closures depending on the specified predicate.static <E> Closure<E>
invokerClosure(java.lang.String methodName)
Creates a Closure that will invoke a specific method on the closure's input object by reflection.static <E> Closure<E>
invokerClosure(java.lang.String methodName, java.lang.Class<?>[] paramTypes, java.lang.Object[] args)
Creates a Closure that will invoke a specific method on the closure's input object by reflection.static <E> Closure<E>
nopClosure()
Gets a Closure that will do nothing.static <E> Closure<E>
switchClosure(java.util.Map<Predicate<E>,Closure<E>> predicatesAndClosures)
Create a new Closure that calls one of the closures depending on the predicates.static <E> Closure<E>
switchClosure(Predicate<? super E>[] predicates, Closure<? super E>[] closures)
Create a new Closure that calls one of the closures depending on the predicates.static <E> Closure<E>
switchClosure(Predicate<? super E>[] predicates, Closure<? super E>[] closures, Closure<? super E> defaultClosure)
Create a new Closure that calls one of the closures depending on the predicates.static <E> Closure<E>
switchMapClosure(java.util.Map<? extends E,Closure<E>> objectsAndClosures)
Create a new Closure that uses the input object as a key to find the closure to call.static <E> Closure<E>
whileClosure(Predicate<? super E> predicate, Closure<? super E> closure)
Creates a Closure that will call the closure repeatedly until the predicate returns false.
-
-
-
Method Detail
-
exceptionClosure
public static <E> Closure<E> exceptionClosure()
Gets a Closure that always throws an exception. This could be useful during testing as a placeholder.- Type Parameters:
E
- the type that the closure acts on- Returns:
- the closure
- See Also:
ExceptionClosure
-
nopClosure
public static <E> Closure<E> nopClosure()
Gets a Closure that will do nothing. This could be useful during testing as a placeholder.- Type Parameters:
E
- the type that the closure acts on- Returns:
- the closure
- See Also:
NOPClosure
-
asClosure
public static <E> Closure<E> asClosure(Transformer<? super E,?> transformer)
Creates a Closure that calls a Transformer each time it is called. The transformer will be called using the closure's input object. The transformer's result will be ignored.- Type Parameters:
E
- the type that the closure acts on- Parameters:
transformer
- the transformer to run each time in the closure, null means nop- Returns:
- the closure
- See Also:
TransformerClosure
-
forClosure
public static <E> Closure<E> forClosure(int count, Closure<? super E> closure)
Creates a Closure that will call the closurecount
times.A null closure or zero count returns the
NOPClosure
.- Type Parameters:
E
- the type that the closure acts on- Parameters:
count
- the number of times to loopclosure
- the closure to call repeatedly- Returns:
- the
for
closure - See Also:
ForClosure
-
whileClosure
public static <E> Closure<E> whileClosure(Predicate<? super E> predicate, Closure<? super E> closure)
Creates a Closure that will call the closure repeatedly until the predicate returns false.- Type Parameters:
E
- the type that the closure acts on- Parameters:
predicate
- the predicate to use as an end of loop test, not nullclosure
- the closure to call repeatedly, not null- Returns:
- the
while
closure - Throws:
java.lang.NullPointerException
- if either argument is null- See Also:
WhileClosure
-
doWhileClosure
public static <E> Closure<E> doWhileClosure(Closure<? super E> closure, Predicate<? super E> predicate)
Creates a Closure that will call the closure once and then repeatedly until the predicate returns false.- Type Parameters:
E
- the type that the closure acts on- Parameters:
closure
- the closure to call repeatedly, not nullpredicate
- the predicate to use as an end of loop test, not null- Returns:
- the
do-while
closure - Throws:
java.lang.NullPointerException
- if either argument is null- See Also:
WhileClosure
-
invokerClosure
public static <E> Closure<E> invokerClosure(java.lang.String methodName)
Creates a Closure that will invoke a specific method on the closure's input object by reflection.- Type Parameters:
E
- the type that the closure acts on- Parameters:
methodName
- the name of the method- Returns:
- the
invoker
closure - Throws:
java.lang.NullPointerException
- if the method name is null- See Also:
InvokerTransformer
,TransformerClosure
-
invokerClosure
public static <E> Closure<E> invokerClosure(java.lang.String methodName, java.lang.Class<?>[] paramTypes, java.lang.Object[] args)
Creates a Closure that will invoke a specific method on the closure's input object by reflection.- Type Parameters:
E
- the type that the closure acts on- Parameters:
methodName
- the name of the methodparamTypes
- the parameter typesargs
- the arguments- Returns:
- the
invoker
closure - Throws:
java.lang.NullPointerException
- if the method name is nulljava.lang.IllegalArgumentException
- if the paramTypes and args don't match- See Also:
InvokerTransformer
,TransformerClosure
-
chainedClosure
public static <E> Closure<E> chainedClosure(Closure<? super E>... closures)
Create a new Closure that calls each closure in turn, passing the result into the next closure.- Type Parameters:
E
- the type that the closure acts on- Parameters:
closures
- an array of closures to chain- Returns:
- the
chained
closure - Throws:
java.lang.NullPointerException
- if the closures array is nulljava.lang.NullPointerException
- if any closure in the array is null- See Also:
ChainedClosure
-
chainedClosure
public static <E> Closure<E> chainedClosure(java.util.Collection<? extends Closure<? super E>> closures)
Create a new Closure that calls each closure in turn, passing the result into the next closure. The ordering is that of the iterator() method on the collection.- Type Parameters:
E
- the type that the closure acts on- Parameters:
closures
- a collection of closures to chain- Returns:
- the
chained
closure - Throws:
java.lang.NullPointerException
- if the closures collection is nulljava.lang.NullPointerException
- if any closure in the collection is nulljava.lang.IllegalArgumentException
- if the closures collection is empty- See Also:
ChainedClosure
-
ifClosure
public static <E> Closure<E> ifClosure(Predicate<? super E> predicate, Closure<? super E> trueClosure)
Create a new Closure that calls another closure based on the result of the specified predicate.- Type Parameters:
E
- the type that the closure acts on- Parameters:
predicate
- the validating predicatetrueClosure
- the closure called if the predicate is true- Returns:
- the
if
closure - Throws:
java.lang.NullPointerException
- if the predicate or closure is null- Since:
- 3.2
- See Also:
IfClosure
-
ifClosure
public static <E> Closure<E> ifClosure(Predicate<? super E> predicate, Closure<? super E> trueClosure, Closure<? super E> falseClosure)
Create a new Closure that calls one of two closures depending on the specified predicate.- Type Parameters:
E
- the type that the closure acts on- Parameters:
predicate
- the predicate to switch ontrueClosure
- the closure called if the predicate is truefalseClosure
- the closure called if the predicate is false- Returns:
- the
switch
closure - Throws:
java.lang.NullPointerException
- if the predicate or either closure is null- See Also:
IfClosure
-
switchClosure
public static <E> Closure<E> switchClosure(Predicate<? super E>[] predicates, Closure<? super E>[] closures)
Create a new Closure that calls one of the closures depending on the predicates.The closure at array location 0 is called if the predicate at array location 0 returned true. Each predicate is evaluated until one returns true.
- Type Parameters:
E
- the type that the closure acts on- Parameters:
predicates
- an array of predicates to check, not nullclosures
- an array of closures to call, not null- Returns:
- the
switch
closure - Throws:
java.lang.NullPointerException
- if the either array is nulljava.lang.NullPointerException
- if any element in the arrays is nulljava.lang.IllegalArgumentException
- if the arrays have different sizes- See Also:
SwitchClosure
-
switchClosure
public static <E> Closure<E> switchClosure(Predicate<? super E>[] predicates, Closure<? super E>[] closures, Closure<? super E> defaultClosure)
Create a new Closure that calls one of the closures depending on the predicates.The closure at array location 0 is called if the predicate at array location 0 returned true. Each predicate is evaluated until one returns true. If no predicates evaluate to true, the default closure is called.
- Type Parameters:
E
- the type that the closure acts on- Parameters:
predicates
- an array of predicates to check, not nullclosures
- an array of closures to call, not nulldefaultClosure
- the default to call if no predicate matches- Returns:
- the
switch
closure - Throws:
java.lang.NullPointerException
- if the either array is nulljava.lang.NullPointerException
- if any element in the arrays is nulljava.lang.IllegalArgumentException
- if the arrays are different sizes- See Also:
SwitchClosure
-
switchClosure
public static <E> Closure<E> switchClosure(java.util.Map<Predicate<E>,Closure<E>> predicatesAndClosures)
Create a new Closure that calls one of the closures depending on the predicates.The Map consists of Predicate keys and Closure values. A closure is called if its matching predicate returns true. Each predicate is evaluated until one returns true. If no predicates evaluate to true, the default closure is called. The default closure is set in the map with a null key. The ordering is that of the iterator() method on the entryset collection of the map.
- Type Parameters:
E
- the type that the closure acts on- Parameters:
predicatesAndClosures
- a map of predicates to closures- Returns:
- the
switch
closure - Throws:
java.lang.NullPointerException
- if the map is nulljava.lang.NullPointerException
- if any closure in the map is nulljava.lang.IllegalArgumentException
- if the map is emptyjava.lang.ClassCastException
- if the map elements are of the wrong type- See Also:
SwitchClosure
-
switchMapClosure
public static <E> Closure<E> switchMapClosure(java.util.Map<? extends E,Closure<E>> objectsAndClosures)
Create a new Closure that uses the input object as a key to find the closure to call.The Map consists of object keys and Closure values. A closure is called if the input object equals the key. If there is no match, the default closure is called. The default closure is set in the map using a null key.
- Type Parameters:
E
- the type that the closure acts on- Parameters:
objectsAndClosures
- a map of objects to closures- Returns:
- the closure
- Throws:
java.lang.NullPointerException
- if the map is nulljava.lang.NullPointerException
- if any closure in the map is nulljava.lang.IllegalArgumentException
- if the map is empty- See Also:
SwitchClosure
-
-