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.functors; 18 19 import java.io.Serializable; 20 import java.util.Objects; 21 22 import org.apache.commons.collections4.FunctorException; 23 import org.apache.commons.collections4.Predicate; 24 import org.apache.commons.collections4.Transformer; 25 26 /** 27 * Predicate implementation that returns the result of a transformer. 28 * 29 * @param <T> the type of the input to the predicate. 30 * @since 3.0 31 */ 32 public final class TransformerPredicate<T> extends AbstractPredicate<T> implements Serializable { 33 34 /** Serial version UID */ 35 private static final long serialVersionUID = -2407966402920578741L; 36 37 /** 38 * Creates the predicate. 39 * 40 * @param <T> the type that the predicate queries 41 * @param transformer the transformer to decorate 42 * @return the predicate 43 * @throws NullPointerException if the transformer is null 44 */ 45 public static <T> Predicate<T> transformerPredicate(final Transformer<? super T, Boolean> transformer) { 46 return new TransformerPredicate<>(Objects.requireNonNull(transformer, "transformer")); 47 } 48 49 /** The transformer to call */ 50 private final Transformer<? super T, Boolean> iTransformer; 51 52 /** 53 * Constructor that performs no validation. 54 * Use {@code transformerPredicate} if you want that. 55 * 56 * @param transformer the transformer to decorate 57 */ 58 public TransformerPredicate(final Transformer<? super T, Boolean> transformer) { 59 iTransformer = transformer; 60 } 61 62 /** 63 * Gets the transformer. 64 * 65 * @return the transformer 66 * @since 3.1 67 */ 68 public Transformer<? super T, Boolean> getTransformer() { 69 return iTransformer; 70 } 71 72 /** 73 * Evaluates the predicate returning the result of the decorated transformer. 74 * 75 * @param object the input object 76 * @return true if decorated transformer returns Boolean.TRUE 77 * @throws FunctorException if the transformer returns an invalid type 78 */ 79 @Override 80 public boolean test(final T object) { 81 final Boolean result = iTransformer.apply(object); 82 if (result == null) { 83 throw new FunctorException( 84 "Transformer must return an instanceof Boolean, it was a null object"); 85 } 86 return result.booleanValue(); 87 } 88 89 }