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 18 package org.apache.commons.lang3.function; 19 20 import java.util.Objects; 21 import java.util.function.BiConsumer; 22 23 /** 24 * A functional interface like {@link BiConsumer} that declares a {@link Throwable}. 25 * 26 * @param <T> Consumed type 1. 27 * @param <U> Consumed type 2. 28 * @param <E> The kind of thrown exception or error. 29 * @since 3.11 30 */ 31 @FunctionalInterface 32 public interface FailableBiConsumer<T, U, E extends Throwable> { 33 34 /** NOP singleton */ 35 @SuppressWarnings("rawtypes") 36 FailableBiConsumer NOP = (t, u) -> { /* NOP */ }; 37 38 /** 39 * Returns The NOP singleton. 40 * 41 * @param <T> Consumed type 1. 42 * @param <U> Consumed type 2. 43 * @param <E> The kind of thrown exception or error. 44 * @return The NOP singleton. 45 */ 46 @SuppressWarnings("unchecked") 47 static <T, U, E extends Throwable> FailableBiConsumer<T, U, E> nop() { 48 return NOP; 49 } 50 51 /** 52 * Accepts the given arguments. 53 * 54 * @param t the first parameter for the consumable to accept 55 * @param u the second parameter for the consumable to accept 56 * @throws E Thrown when the consumer fails. 57 */ 58 void accept(T t, U u) throws E; 59 60 /** 61 * Returns a composed {@link FailableBiConsumer} like {@link BiConsumer#andThen(BiConsumer)}. 62 * 63 * @param after the operation to perform after this one. 64 * @return a composed {@link FailableBiConsumer} like {@link BiConsumer#andThen(BiConsumer)}. 65 * @throws NullPointerException when {@code after} is null. 66 */ 67 default FailableBiConsumer<T, U, E> andThen(final FailableBiConsumer<? super T, ? super U, E> after) { 68 Objects.requireNonNull(after); 69 return (t, u) -> { 70 accept(t, u); 71 after.accept(t, u); 72 }; 73 } 74 }