1 /*- 2 * #%L 3 * io.earcam.unexceptional 4 * %% 5 * Copyright (C) 2016 - 2017 earcam 6 * %% 7 * SPDX-License-Identifier: (BSD-3-Clause OR EPL-1.0 OR Apache-2.0 OR MIT) 8 * 9 * You <b>must</b> choose to accept, in full - any individual or combination of 10 * the following licenses: 11 * <ul> 12 * <li><a href="https://opensource.org/licenses/BSD-3-Clause">BSD-3-Clause</a></li> 13 * <li><a href="https://www.eclipse.org/legal/epl-v10.html">EPL-1.0</a></li> 14 * <li><a href="https://www.apache.org/licenses/LICENSE-2.0">Apache-2.0</a></li> 15 * <li><a href="https://opensource.org/licenses/MIT">MIT</a></li> 16 * </ul> 17 * #L% 18 */ 19 package io.earcam.unexceptional; 20 21 import java.io.Serializable; // NOSONAR SonarQube false positive - putting @SuppressWarnings("squid:UselessImportCheck") on class has no effect, can't put at package level either 22 import java.util.Objects; 23 24 /** 25 * A checked parallel of {@link java.util.function.Predicate} 26 * 27 * @param <T> argument type 28 * @param <E> the type of Throwable declared 29 * 30 * @since 0.2.0 31 * 32 * @see java.util.function.Predicate 33 */ 34 @FunctionalInterface 35 public interface CheckedPredicate<T, E extends Throwable> { 36 37 /** 38 * See {@link java.util.function.Predicate#test(Object)} 39 * 40 * @param t argument 41 * @return {@code true} if predicate matches, else {@code false} 42 * @throws Throwable any throwable 43 * @see java.util.function.Predicate#test(Object) 44 */ 45 public abstract boolean test(T t) throws E; 46 47 48 /** 49 * See {@link java.util.function.Predicate#and(java.util.function.Predicate)} 50 * 51 * @param other the predicate to be compounded with logical <b>and</b> 52 * @return the composite {@link CheckedPredicate} 53 * @throws NullPointerException if {@code other} is {@code null} 54 */ 55 @SuppressWarnings("squid:S1905") // SonarQube false positive 56 public default CheckedPredicate<T, E> and(/* @Nonnull */ CheckedPredicate<? super T, ? extends E> other) 57 { 58 Objects.requireNonNull(other); 59 return (CheckedPredicate<T, E> & Serializable) t -> test(t) && other.test(t); 60 } 61 62 63 /** 64 * See {@link java.util.function.Predicate#negate()} 65 * 66 * @return the negated {@link CheckedPredicate} 67 */ 68 @SuppressWarnings("squid:S1905") // SonarQube false positive 69 public default CheckedPredicate<T, E> negate() 70 { 71 return (CheckedPredicate<T, E> & Serializable) t -> !test(t); 72 } 73 74 75 /** 76 * See {@link java.util.function.Predicate#or(java.util.function.Predicate)} 77 * 78 * @param other the predicate to be compounded with logical <b>or</b> 79 * @return the composite {@link CheckedPredicate} 80 * @throws NullPointerException if {@code other} is {@code null} 81 */ 82 @SuppressWarnings("squid:S1905") // SonarQube false positive 83 public default CheckedPredicate<T, E> or(/* @Nonnull */ CheckedPredicate<? super T, ? extends E> other) 84 { 85 Objects.requireNonNull(other); 86 return (CheckedPredicate<T, E> & Serializable) t -> test(t) || other.test(t); 87 } 88 }