FailableConsumer.java

  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.lang3.function;

  18. import java.util.Objects;
  19. import java.util.function.Consumer;
  20. import java.util.function.Function;

  21. /**
  22.  * A functional interface like {@link Consumer} that declares a {@link Throwable}.
  23.  *
  24.  * <p>
  25.  * This is a functional interface whose functional method is {@link #accept(Object)}.
  26.  * </p>
  27.  *
  28.  * @param <T> the type of the input to the operation
  29.  * @param <E> Thrown exception type.
  30.  * @since 3.11
  31.  */
  32. @FunctionalInterface
  33. public interface FailableConsumer<T, E extends Throwable> {

  34.     /** NOP singleton */
  35.     @SuppressWarnings("rawtypes")
  36.     FailableConsumer NOP = Function.identity()::apply;

  37.     /**
  38.      * Returns The NOP singleton.
  39.      *
  40.      * @param <T> Consumed type 1.
  41.      * @param <E> The kind of thrown exception or error.
  42.      * @return The NOP singleton.
  43.      */
  44.     @SuppressWarnings("unchecked")
  45.     static <T, E extends Throwable> FailableConsumer<T, E> nop() {
  46.         return NOP;
  47.     }

  48.     /**
  49.      * Accepts the given arguments.
  50.      *
  51.      * @param object the parameter for the consumable to accept
  52.      * @throws E Thrown when the consumer fails.
  53.      */
  54.     void accept(T object) throws E;

  55.     /**
  56.      * Returns a composed {@link Consumer} like {@link Consumer#andThen(Consumer)}.
  57.      *
  58.      * @param after the operation to perform after this operation
  59.      * @return a composed {@link Consumer} like {@link Consumer#andThen(Consumer)}.
  60.      * @throws NullPointerException when {@code after} is null
  61.      */
  62.     default FailableConsumer<T, E> andThen(final FailableConsumer<? super T, E> after) {
  63.         Objects.requireNonNull(after);
  64.         return (final T t) -> {
  65.             accept(t);
  66.             after.accept(t);
  67.         };
  68.     }
  69. }