All Downloads are FREE. Search and download functionalities are using the official Maven repository.

buckelieg.jdbc.fn.TryFunction Maven / Gradle / Ivy

The newest version!
/*
 * Copyright 2024- Anatoly Kutyakov
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package buckelieg.jdbc.fn;

import static java.util.Objects.requireNonNull;

/**
 * One-argument function which returns a result that might throw an exception
 * 
There is no requirement that a new or distinct result be returned each time the function is invoked. *
This is a functional interface whose functional method is {@link #apply(Object)}}. * * @param argument type * @param result type * @param an exception type thrown */ @FunctionalInterface public interface TryFunction { /** * Represents a one-argument function that might throw an Exception * * @param input function input. * @return mapped value * @throws E in case of something went wrong */ O apply(I input) throws E; /** * Returns a function that always returns its input argument * * @param the type of the input and output objects to the function * @return a function that always returns its input argument */ static TryFunction identity() { return t -> t; } /** * Returns reference of lambda expression *
Typical usage is: *
{@code TryFunction.of(x -> null).andThen(nil -> null);} * * @param tryFunction a function * @param argument type * @param result type * @param exception type * @return lambda as {@link TryFunction} reference * @throws NullPointerException if tryFunction is null */ static TryFunction of(TryFunction tryFunction) { return requireNonNull(tryFunction); } /** * Returns a composed function that first applies the {@code before} function to its input, and then applies this function to the result * * @param the type of input to the {@code before} function, and to the * composed function * @param before the function to apply before this function is applied * @return a composed function that first applies the {@code before} * function and then applies this function * @throws E an exception * @throws NullPointerException if before is null * @see #andThen(TryFunction) */ default TryFunction compose(TryFunction before) throws E { if (null == before) throw new NullPointerException("before Function must be provided"); return (V v) -> apply(before.apply(v)); } /** * Returns a composed function that first applies this function to its input, and then applies the {@code after} function to the result * * @param the type of output of the {@code after} function, and of the * composed function * @param after the function to apply after this function is applied * @return a composed function that first applies this function and then * applies the {@code after} function * @throws E an exception * @throws NullPointerException if after is null * @see #compose(TryFunction) */ default TryFunction andThen(TryFunction after) throws E { if (null == after) throw new NullPointerException("after Function must be provided"); return (I t) -> after.apply(apply(t)); } }