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
commit 8eef2fc92229e47889e66774edd3df0a9f6d6281 Author: Gary Gregory <[email protected]> AuthorDate: Sat May 6 15:43:58 2023 -0400 Add Pair.accept(FailableBiConsumer) Add Pair.apply(FailableBiFunction) --- src/changes/changes.xml | 2 ++ .../java/org/apache/commons/lang3/tuple/Pair.java | 28 +++++++++++++++++++ .../org/apache/commons/lang3/tuple/PairTest.java | 31 ++++++++++++++++++++++ 3 files changed, 61 insertions(+) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index c9ff7eb17..6c09ffcdb 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -202,6 +202,8 @@ The <action> type attribute can be add,update,fix,remove. <action type="add" dev="ggregory" due-to="Diego Marcilio, Bruno P. Kinoshita, Gary Gregory">Add missing exception javadoc/tests for some null arguments #869.</action> <action type="add" dev="ggregory" due-to="Gary Gregory">Add ClassLoaderUtils.getSystemURLs() and getThreadURLs().</action> <action type="add" dev="ggregory" due-to="Gary Gregory">Add RegExUtils.dotAll() and dotAllMatcher().</action> + <action type="add" dev="ggregory" due-to="Gary Gregory">Add Pair.accept(FailableBiConsumer).</action> + <action type="add" dev="ggregory" due-to="Gary Gregory">Add Pair.apply(FailableBiFunction).</action> <!-- UPDATE --> <action type="update" dev="ggregory" due-to="Dependabot, XenoAmess, Gary Gregory">Bump actions/cache from 2.1.4 to 3.0.10 #742, #752, #764, #833, #867, #959, #964.</action> <action type="update" dev="ggregory" due-to="Dependabot, Gary Gregory">Bump actions/checkout from 2 to 3.1.0 #819, #825, #859, #963.</action> diff --git a/src/main/java/org/apache/commons/lang3/tuple/Pair.java b/src/main/java/org/apache/commons/lang3/tuple/Pair.java index 3b97e061b..17552f98c 100644 --- a/src/main/java/org/apache/commons/lang3/tuple/Pair.java +++ b/src/main/java/org/apache/commons/lang3/tuple/Pair.java @@ -21,6 +21,8 @@ import java.util.Map; import java.util.Objects; import org.apache.commons.lang3.builder.CompareToBuilder; +import org.apache.commons.lang3.function.FailableBiConsumer; +import org.apache.commons.lang3.function.FailableBiFunction; /** * A pair consisting of two elements. @@ -117,6 +119,32 @@ public abstract class Pair<L, R> implements Map.Entry<L, R>, Comparable<Pair<L, return ImmutablePair.ofNonNull(left, right); } + /** + * Accepts this key and value as arguments to the given consumer. + * + * @param <E> The kind of thrown exception or error. + * @param consumer the consumer to call. + * @throws E Thrown when the consumer fails. + * @since 3.13.0 + */ + public <E extends Throwable> void accept(final FailableBiConsumer<L, R, E> consumer) throws E { + consumer.accept(getKey(), getValue()); + } + + /** + * Applies this key and value as arguments to the given function. + * + * @param <V> The function return type. + * @param <E> The kind of thrown exception or error. + * @param function the consumer to call. + * @return the function's return value. + * @throws E Thrown when the consumer fails. + * @since 3.13.0 + */ + public <V, E extends Throwable> V apply(final FailableBiFunction<L, R, V, E> function) throws E { + return function.apply(getKey(), getValue()); + } + /** * Compares the pair based on the left element followed by the right element. * The types must be {@link Comparable}. diff --git a/src/test/java/org/apache/commons/lang3/tuple/PairTest.java b/src/test/java/org/apache/commons/lang3/tuple/PairTest.java index 235f07a61..f5c92a76d 100644 --- a/src/test/java/org/apache/commons/lang3/tuple/PairTest.java +++ b/src/test/java/org/apache/commons/lang3/tuple/PairTest.java @@ -25,6 +25,7 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.Calendar; import java.util.HashMap; import java.util.HashSet; +import java.util.Map; import java.util.Map.Entry; import org.apache.commons.lang3.AbstractLangTest; @@ -35,6 +36,36 @@ import org.junit.jupiter.api.Test; */ public class PairTest extends AbstractLangTest { + @Test + public void testAccept() { + final Pair<String, String> pair1 = Pair.of("A", "D"); + final Pair<String, String> pair2 = Pair.of("B", "C"); + final Map<String, String> map = new HashMap<>(); + pair1.accept(map::put); + pair2.accept(map::put); + assertEquals("D", map.get("A")); + assertEquals("C", map.get("B")); + pair1.accept(map::put); + pair2.accept(map::put); + assertEquals("D", map.get("A")); + assertEquals("C", map.get("B")); + } + + @Test + public void testApply() { + final Pair<String, String> pair1 = Pair.of("A", "D"); + final Pair<String, String> pair2 = Pair.of("B", "C"); + final Map<String, String> map = new HashMap<>(); + assertEquals(null, pair1.apply(map::put)); + assertEquals(null, pair2.apply(map::put)); + assertEquals("D", map.get("A")); + assertEquals("C", map.get("B")); + assertEquals("D", pair1.apply(map::put)); + assertEquals("C", pair2.apply(map::put)); + assertEquals("D", map.get("A")); + assertEquals("C", map.get("B")); + } + @Test public void testComparable1() { final Pair<String, String> pair1 = Pair.of("A", "D");
