You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by gg...@apache.org on 2020/06/25 13:44:28 UTC
[commons-lang] branch master updated: [LANG-1568] Complete
FailableFunction.
This is an automated email from the ASF dual-hosted git repository.
ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-lang.git
The following commit(s) were added to refs/heads/master by this push:
new 00c8096 [LANG-1568] Complete FailableFunction.
00c8096 is described below
commit 00c8096cbf6ca89b17685488eddb5d0782fa18e4
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Thu Jun 25 09:44:22 2020 -0400
[LANG-1568] Complete FailableFunction.
---
.../commons/lang3/function/FailableFunction.java | 25 +++++++++++++++++++
.../lang3/function/FailableFunctionsTest.java | 28 ++++++++++++++++++++++
2 files changed, 53 insertions(+)
diff --git a/src/main/java/org/apache/commons/lang3/function/FailableFunction.java b/src/main/java/org/apache/commons/lang3/function/FailableFunction.java
index cb100a4..49af31c 100644
--- a/src/main/java/org/apache/commons/lang3/function/FailableFunction.java
+++ b/src/main/java/org/apache/commons/lang3/function/FailableFunction.java
@@ -36,6 +36,17 @@ public interface FailableFunction<T, R, E extends Throwable> {
FailableFunction NOP = t -> null;
/**
+ * Returns a function that always returns its input argument.
+ *
+ * @param <T> the type of the input and output objects to the function
+ * @param <E> Thrown exception.
+ * @return a function that always returns its input argument
+ */
+ static <T, E extends Throwable> FailableFunction<T, T, E> identity() {
+ return t -> t;
+ }
+
+ /**
* Returns The NOP singleton.
*
* @param <T> Consumed type 1.
@@ -70,4 +81,18 @@ public interface FailableFunction<T, R, E extends Throwable> {
*/
R apply(T input) throws E;
+ /**
+ * Returns a composed {@code FailableFunction} like {@link Function#compose(Function)}.
+ *
+ * @param <V> the input type to the {@code before} function, and to the composed function.
+ * @param before the operator to apply before this one.
+ * @return a a composed {@code FailableFunction} like {@link Function#compose(Function)}.
+ * @throws NullPointerException if before is null.
+ * @throws E Thrown when a consumer fails.
+ * @see #andThen(FailableFunction)
+ */
+ default <V> FailableFunction<V, R, E> compose(final FailableFunction<? super V, ? extends T, E> before) throws E {
+ Objects.requireNonNull(before);
+ return (final V v) -> apply(before.apply(v));
+ }
}
diff --git a/src/test/java/org/apache/commons/lang3/function/FailableFunctionsTest.java b/src/test/java/org/apache/commons/lang3/function/FailableFunctionsTest.java
index ce8b567..ca3ccd4 100644
--- a/src/test/java/org/apache/commons/lang3/function/FailableFunctionsTest.java
+++ b/src/test/java/org/apache/commons/lang3/function/FailableFunctionsTest.java
@@ -860,6 +860,34 @@ public class FailableFunctionsTest {
}
@Test
+ public void testFunctionCompose() throws Throwable {
+ final Testable<?, ?> testable = new Testable<>(null);
+ final FailableFunction<Object, Integer, Throwable> failing = t -> {
+ testable.setThrowable(ERROR);
+ testable.test();
+ return 0;
+ };
+ final FailableFunction<Object, Integer, Throwable> nop = FailableFunction.nop();
+ Throwable e = assertThrows(OutOfMemoryError.class, () -> nop.compose(failing).apply(0));
+ assertSame(ERROR, e);
+ e = assertThrows(OutOfMemoryError.class, () -> failing.compose(nop).apply(0));
+ assertSame(ERROR, e);
+ // Does not throw
+ nop.compose(nop);
+ // Documented in Javadoc edge-case.
+ assertThrows(NullPointerException.class, () -> failing.compose(null));
+ }
+
+ @Test
+ public void testFunctionIdentity() throws Throwable {
+ final FailableFunction<Integer, Integer, Throwable> nop = FailableFunction.identity();
+ // Does not throw
+ nop.compose(nop);
+ // Documented in Javadoc edge-case.
+ assertThrows(NullPointerException.class, () -> nop.compose(null));
+ }
+
+ @Test
public void testGetAsBooleanSupplier() {
final Testable<?, ?> testable = new Testable<>(ILLEGAL_STATE_EXCEPTION);
Throwable e = assertThrows(IllegalStateException.class,