From ed42640e428ec29061ee009cdbdce0a2116f6a83 Mon Sep 17 00:00:00 2001 From: Robert von Burg Date: Wed, 6 Feb 2019 14:33:29 +0100 Subject: [PATCH] [New] Added new checked and throwing functional interfaces --- .../li/strolch/utils/CheckedConsumer.java | 6 + .../li/strolch/utils/CheckedFunction.java | 6 + .../li/strolch/utils/CheckedPredicate.java | 6 + .../li/strolch/utils/CheckedSupplier.java | 6 + .../main/java/li/strolch/utils/Predicate.java | 119 ++++++++++++++++++ .../li/strolch/utils/ThrowingConsumer.java | 18 +++ .../li/strolch/utils/ThrowingFunction.java | 18 +++ .../li/strolch/utils/ThrowingPredicate.java | 16 +++ .../li/strolch/utils/ThrowingSupplier.java | 18 +++ 9 files changed, 213 insertions(+) create mode 100644 li.strolch.utils/src/main/java/li/strolch/utils/CheckedConsumer.java create mode 100644 li.strolch.utils/src/main/java/li/strolch/utils/CheckedFunction.java create mode 100644 li.strolch.utils/src/main/java/li/strolch/utils/CheckedPredicate.java create mode 100644 li.strolch.utils/src/main/java/li/strolch/utils/CheckedSupplier.java create mode 100644 li.strolch.utils/src/main/java/li/strolch/utils/Predicate.java create mode 100644 li.strolch.utils/src/main/java/li/strolch/utils/ThrowingConsumer.java create mode 100644 li.strolch.utils/src/main/java/li/strolch/utils/ThrowingFunction.java create mode 100644 li.strolch.utils/src/main/java/li/strolch/utils/ThrowingPredicate.java create mode 100644 li.strolch.utils/src/main/java/li/strolch/utils/ThrowingSupplier.java diff --git a/li.strolch.utils/src/main/java/li/strolch/utils/CheckedConsumer.java b/li.strolch.utils/src/main/java/li/strolch/utils/CheckedConsumer.java new file mode 100644 index 000000000..e175156fd --- /dev/null +++ b/li.strolch.utils/src/main/java/li/strolch/utils/CheckedConsumer.java @@ -0,0 +1,6 @@ +package li.strolch.utils; + +@FunctionalInterface +public interface CheckedConsumer { + void accept(T t) throws Exception; +} diff --git a/li.strolch.utils/src/main/java/li/strolch/utils/CheckedFunction.java b/li.strolch.utils/src/main/java/li/strolch/utils/CheckedFunction.java new file mode 100644 index 000000000..461cb3062 --- /dev/null +++ b/li.strolch.utils/src/main/java/li/strolch/utils/CheckedFunction.java @@ -0,0 +1,6 @@ +package li.strolch.utils; + +@FunctionalInterface +public interface CheckedFunction { + R apply(T t) throws Exception; +} \ No newline at end of file diff --git a/li.strolch.utils/src/main/java/li/strolch/utils/CheckedPredicate.java b/li.strolch.utils/src/main/java/li/strolch/utils/CheckedPredicate.java new file mode 100644 index 000000000..8b494f7e3 --- /dev/null +++ b/li.strolch.utils/src/main/java/li/strolch/utils/CheckedPredicate.java @@ -0,0 +1,6 @@ +package li.strolch.utils; + +@FunctionalInterface +public interface CheckedPredicate { + boolean test() throws Exception; +} diff --git a/li.strolch.utils/src/main/java/li/strolch/utils/CheckedSupplier.java b/li.strolch.utils/src/main/java/li/strolch/utils/CheckedSupplier.java new file mode 100644 index 000000000..e19c8417e --- /dev/null +++ b/li.strolch.utils/src/main/java/li/strolch/utils/CheckedSupplier.java @@ -0,0 +1,6 @@ +package li.strolch.utils; + +@FunctionalInterface +public interface CheckedSupplier { + T get() throws Exception; +} diff --git a/li.strolch.utils/src/main/java/li/strolch/utils/Predicate.java b/li.strolch.utils/src/main/java/li/strolch/utils/Predicate.java new file mode 100644 index 000000000..50776d011 --- /dev/null +++ b/li.strolch.utils/src/main/java/li/strolch/utils/Predicate.java @@ -0,0 +1,119 @@ +/* + * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. + * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + */ +package li.strolch.utils; + +import java.util.Objects; + +/** + * Represents a predicate (boolean-valued function) of one argument. + * + *

This is a functional interface + * whose functional method is {@link #test(Object)}. + * + * @param the type of the input to the predicate + * + * @since 1.8 + */ +@FunctionalInterface +public interface Predicate { + + /** + * Evaluates this predicate on the given argument. + * + * @param t the input argument + * @return {@code true} if the input argument matches the predicate, + * otherwise {@code false} + */ + boolean test(T t); + + /** + * Returns a composed predicate that represents a short-circuiting logical + * AND of this predicate and another. When evaluating the composed + * predicate, if this predicate is {@code false}, then the {@code other} + * predicate is not evaluated. + * + *

Any exceptions thrown during evaluation of either predicate are relayed + * to the caller; if evaluation of this predicate throws an exception, the + * {@code other} predicate will not be evaluated. + * + * @param other a predicate that will be logically-ANDed with this + * predicate + * @return a composed predicate that represents the short-circuiting logical + * AND of this predicate and the {@code other} predicate + * @throws NullPointerException if other is null + */ + default Predicate and(Predicate other) { + Objects.requireNonNull(other); + return (t) -> test(t) && other.test(t); + } + + /** + * Returns a predicate that represents the logical negation of this + * predicate. + * + * @return a predicate that represents the logical negation of this + * predicate + */ + default Predicate negate() { + return (t) -> !test(t); + } + + /** + * Returns a composed predicate that represents a short-circuiting logical + * OR of this predicate and another. When evaluating the composed + * predicate, if this predicate is {@code true}, then the {@code other} + * predicate is not evaluated. + * + *

Any exceptions thrown during evaluation of either predicate are relayed + * to the caller; if evaluation of this predicate throws an exception, the + * {@code other} predicate will not be evaluated. + * + * @param other a predicate that will be logically-ORed with this + * predicate + * @return a composed predicate that represents the short-circuiting logical + * OR of this predicate and the {@code other} predicate + * @throws NullPointerException if other is null + */ + default Predicate or(Predicate other) { + Objects.requireNonNull(other); + return (t) -> test(t) || other.test(t); + } + + /** + * Returns a predicate that tests if two arguments are equal according + * to {@link Objects#equals(Object, Object)}. + * + * @param the type of arguments to the predicate + * @param targetRef the object reference with which to compare for equality, + * which may be {@code null} + * @return a predicate that tests if two arguments are equal according + * to {@link Objects#equals(Object, Object)} + */ + static Predicate isEqual(Object targetRef) { + return (null == targetRef) + ? Objects::isNull + : object -> targetRef.equals(object); + } +} diff --git a/li.strolch.utils/src/main/java/li/strolch/utils/ThrowingConsumer.java b/li.strolch.utils/src/main/java/li/strolch/utils/ThrowingConsumer.java new file mode 100644 index 000000000..ad794ff15 --- /dev/null +++ b/li.strolch.utils/src/main/java/li/strolch/utils/ThrowingConsumer.java @@ -0,0 +1,18 @@ +package li.strolch.utils; + +import java.util.function.Consumer; + +@FunctionalInterface +public interface ThrowingConsumer extends Consumer { + + @Override + default void accept(final T elem) { + try { + acceptThrows(elem); + } catch (final Exception e) { + throw new RuntimeException(e); + } + } + + void acceptThrows(T elem) throws Exception; +} diff --git a/li.strolch.utils/src/main/java/li/strolch/utils/ThrowingFunction.java b/li.strolch.utils/src/main/java/li/strolch/utils/ThrowingFunction.java new file mode 100644 index 000000000..2a886ce78 --- /dev/null +++ b/li.strolch.utils/src/main/java/li/strolch/utils/ThrowingFunction.java @@ -0,0 +1,18 @@ +package li.strolch.utils; + +import java.util.function.Function; + +@FunctionalInterface +public interface ThrowingFunction extends Function { + + @Override + default R apply(T t) { + try { + return applyThrows(t); + } catch (final Exception e) { + throw new RuntimeException(e); + } + } + + R applyThrows(T t) throws Exception; +} \ No newline at end of file diff --git a/li.strolch.utils/src/main/java/li/strolch/utils/ThrowingPredicate.java b/li.strolch.utils/src/main/java/li/strolch/utils/ThrowingPredicate.java new file mode 100644 index 000000000..55ef0415c --- /dev/null +++ b/li.strolch.utils/src/main/java/li/strolch/utils/ThrowingPredicate.java @@ -0,0 +1,16 @@ +package li.strolch.utils; + +@FunctionalInterface +public interface ThrowingPredicate extends Predicate { + + @Override + default boolean test(T t) { + try { + return testThrows(t); + } catch (final Exception e) { + throw new RuntimeException(e); + } + } + + boolean testThrows(T t) throws Exception; +} diff --git a/li.strolch.utils/src/main/java/li/strolch/utils/ThrowingSupplier.java b/li.strolch.utils/src/main/java/li/strolch/utils/ThrowingSupplier.java new file mode 100644 index 000000000..0e13d9681 --- /dev/null +++ b/li.strolch.utils/src/main/java/li/strolch/utils/ThrowingSupplier.java @@ -0,0 +1,18 @@ +package li.strolch.utils; + +import java.util.function.Supplier; + +@FunctionalInterface +public interface ThrowingSupplier extends Supplier { + + @Override + default T get() { + try { + return getThrows(); + } catch (final Exception e) { + throw new RuntimeException(e); + } + } + + T getThrows() throws Exception; +}