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 670a832  [LANG-1503] Add factory methods to Pair classes with 
Map.Entry input. #454.
670a832 is described below

commit 670a832d4d78c0206180ec2106a5e09592f65cc0
Author: Gary Gregory <garydgreg...@gmail.com>
AuthorDate: Sat Dec 21 17:28:30 2019 -0500

    [LANG-1503] Add factory methods to Pair classes with Map.Entry input.
    #454.
    
    Also adds tests that were not in the PR.
---
 src/changes/changes.xml                            |  1 +
 .../apache/commons/lang3/tuple/ImmutablePair.java  | 31 +++++++++++++-
 .../apache/commons/lang3/tuple/MutablePair.java    | 29 ++++++++++++-
 .../java/org/apache/commons/lang3/tuple/Pair.java  | 20 ++++++++-
 .../commons/lang3/tuple/ImmutablePairTest.java     | 47 +++++++++++++++++-----
 .../commons/lang3/tuple/MutablePairTest.java       | 45 +++++++++++++++++----
 .../org/apache/commons/lang3/tuple/PairTest.java   | 15 ++++++-
 7 files changed, 164 insertions(+), 24 deletions(-)

diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index c590ff6..b414aa8 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -86,6 +86,7 @@ The <action> type attribute can be add,update,fix,remove.
     <action                   type="update" dev="ggregory" due-to="Gary 
Gregory">Update POM parent: org.apache.commons:commons-parent 48 -> 50.</action>
     <action                   type="update" dev="ggregory" due-to="Peter 
Verhas">BooleanUtils Javadoc #469.</action>
     <action                   type="update" dev="ggregory" due-to="Peter 
Verhas">Functions Javadoc #466.</action>
+    <action issue="LANG-1503" type="add" dev="ggregory" due-to="XenoAmess, 
Gary Gregory">Add factory methods to Pair classes with Map.Entry input. 
#454.</action>
   </release>
 
   <release version="3.9" date="2019-04-09" description="New features and bug 
fixes. Requires Java 8, supports Java 9, 10, 11.">
diff --git a/src/main/java/org/apache/commons/lang3/tuple/ImmutablePair.java 
b/src/main/java/org/apache/commons/lang3/tuple/ImmutablePair.java
index 488fd7c..a9be293 100644
--- a/src/main/java/org/apache/commons/lang3/tuple/ImmutablePair.java
+++ b/src/main/java/org/apache/commons/lang3/tuple/ImmutablePair.java
@@ -16,6 +16,8 @@
  */
 package org.apache.commons.lang3.tuple;
 
+import java.util.Map;
+
 /**
  * <p>An immutable pair consisting of two {@code Object} elements.</p>
  *
@@ -80,7 +82,7 @@ public final class ImmutablePair<L, R> extends Pair<L, R> {
     }
 
     /**
-     * <p>Obtains an immutable pair of two objects inferring the generic 
types.</p>
+     * <p>Creates an immutable pair of two objects inferring the generic 
types.</p>
      *
      * <p>This factory allows the pair to be created using inference to
      * obtain the generic types.</p>
@@ -94,6 +96,32 @@ public final class ImmutablePair<L, R> extends Pair<L, R> {
     public static <L, R> ImmutablePair<L, R> of(final L left, final R right) {
         return new ImmutablePair<>(left, right);
     }
+
+    /**
+     * <p>Creates an immutable pair from an existing pair.</p>
+     *
+     * <p>This factory allows the pair to be created using inference to
+     * obtain the generic types.</p>
+     *
+     * @param <L> the left element type
+     * @param <R> the right element type
+     * @param pair the existing pair.
+     * @return a pair formed from the two parameters, not null
+     * @since 3.10
+     */
+    public static <L, R> ImmutablePair<L, R> of(final Map.Entry<L, R> pair) {
+        final L left;
+        final R right;
+        if (pair != null) {
+            left = pair.getKey();
+            right = pair.getValue();
+        } else {
+            left = null;
+            right = null;
+        }
+        return new ImmutablePair<>(left, right);
+    }
+
     /** Left object */
     public final L left;
 
@@ -112,7 +140,6 @@ public final class ImmutablePair<L, R> extends Pair<L, R> {
         this.right = right;
     }
 
-    //-----------------------------------------------------------------------
     /**
      * {@inheritDoc}
      */
diff --git a/src/main/java/org/apache/commons/lang3/tuple/MutablePair.java 
b/src/main/java/org/apache/commons/lang3/tuple/MutablePair.java
index 58a66a7..9750e20 100644
--- a/src/main/java/org/apache/commons/lang3/tuple/MutablePair.java
+++ b/src/main/java/org/apache/commons/lang3/tuple/MutablePair.java
@@ -16,6 +16,8 @@
  */
 package org.apache.commons.lang3.tuple;
 
+import java.util.Map;
+
 /**
  * <p>A mutable pair consisting of two {@code Object} elements.</p>
  *
@@ -56,7 +58,7 @@ public class MutablePair<L, R> extends Pair<L, R> {
     }
 
     /**
-     * <p>Obtains a mutable pair of two objects inferring the generic 
types.</p>
+     * <p>Creates a mutable pair of two objects inferring the generic 
types.</p>
      *
      * <p>This factory allows the pair to be created using inference to
      * obtain the generic types.</p>
@@ -70,6 +72,31 @@ public class MutablePair<L, R> extends Pair<L, R> {
     public static <L, R> MutablePair<L, R> of(final L left, final R right) {
         return new MutablePair<>(left, right);
     }
+
+    /**
+     * <p>Creates a mutable pair from an existing pair.</p>
+     *
+     * <p>This factory allows the pair to be created using inference to
+     * obtain the generic types.</p>
+     *
+     * @param <L> the left element type
+     * @param <R> the right element type
+     * @param pair the existing pair.
+     * @return a pair formed from the two parameters, not null
+     */
+    public static <L, R> MutablePair<L, R> of(final Map.Entry<L, R> pair) {
+        final L left;
+        final R right;
+        if (pair != null) {
+            left = pair.getKey();
+            right = pair.getValue();
+        } else {
+            left = null;
+            right = null;
+        }
+        return new MutablePair<>(left, right);
+    }
+
     /** Left object */
     public L left;
 
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 b64af80..fda2618 100644
--- a/src/main/java/org/apache/commons/lang3/tuple/Pair.java
+++ b/src/main/java/org/apache/commons/lang3/tuple/Pair.java
@@ -89,7 +89,7 @@ public abstract class Pair<L, R> implements Map.Entry<L, R>, 
Comparable<Pair<L,
     }
 
     /**
-     * <p>Obtains an immutable pair of two objects inferring the generic 
types.</p>
+     * <p>Creates an immutable pair of two objects inferring the generic 
types.</p>
      *
      * <p>This factory allows the pair to be created using inference to
      * obtain the generic types.</p>
@@ -101,7 +101,23 @@ public abstract class Pair<L, R> implements Map.Entry<L, 
R>, Comparable<Pair<L,
      * @return a pair formed from the two parameters, not null
      */
     public static <L, R> Pair<L, R> of(final L left, final R right) {
-        return new ImmutablePair<>(left, right);
+        return ImmutablePair.of(left, right);
+    }
+
+    /**
+     * <p>Creates an immutable pair from an existing pair.</p>
+     *
+     * <p>This factory allows the pair to be created using inference to
+     * obtain the generic types.</p>
+     *
+     * @param <L> the left element type
+     * @param <R> the right element type
+     * @param pair the existing pair.
+     * @return a pair formed from the two parameters, not null
+     * @since 3.10
+     */
+    public static <L, R> Pair<L, R> of(final Map.Entry<L, R> pair) {
+        return ImmutablePair.of(pair);
     }
 
     //-----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/commons/lang3/tuple/ImmutablePairTest.java 
b/src/test/java/org/apache/commons/lang3/tuple/ImmutablePairTest.java
index 8fb2f56..218c814 100644
--- a/src/test/java/org/apache/commons/lang3/tuple/ImmutablePairTest.java
+++ b/src/test/java/org/apache/commons/lang3/tuple/ImmutablePairTest.java
@@ -54,16 +54,28 @@ public class ImmutablePairTest {
 
     @Test
     public void testBasic() {
-        final ImmutablePair<Integer, String> pair = new ImmutablePair<>(0, 
"foo");
-        assertEquals(0, pair.left.intValue());
-        assertEquals(0, pair.getLeft().intValue());
-        assertEquals("foo", pair.right);
-        assertEquals("foo", pair.getRight());
-        final ImmutablePair<Object, String> pair2 = new ImmutablePair<>(null, 
"bar");
-        assertNull(pair2.left);
-        assertNull(pair2.getLeft());
-        assertEquals("bar", pair2.right);
-        assertEquals("bar", pair2.getRight());
+        ImmutablePair<Integer, String> oldPair = new ImmutablePair<>(0, "foo");
+        ImmutablePair<Integer, String> nowPair;
+        for (int i=0; i<4; i++) {
+            nowPair = ImmutablePair.of(oldPair);
+            assertEquals(0, nowPair.left.intValue());
+            assertEquals(0, nowPair.getLeft().intValue());
+            assertEquals("foo", nowPair.right);
+            assertEquals("foo", nowPair.getRight());
+            assertEquals(oldPair, nowPair);
+            oldPair = nowPair;
+        }
+
+        ImmutablePair<Object, String> oldPair2 = new ImmutablePair<>(null, 
"bar");
+        ImmutablePair<Object, String> nowPair2;
+        for (int i=0; i<4; i++) {
+            nowPair2 = ImmutablePair.of(oldPair2);
+            assertNull(nowPair2.left);
+            assertNull(nowPair2.getLeft());
+            assertEquals("bar", nowPair2.right);
+            assertEquals("bar", nowPair2.getRight());
+            oldPair2 = nowPair2;
+        }
     }
 
     @Test
@@ -121,7 +133,17 @@ public class ImmutablePairTest {
     }
 
     @Test
-    public void testPairOf() {
+    public void testPairOfMapEntry() {
+        final HashMap<Integer, String> map = new HashMap<>();
+        map.put(0, "foo");
+        final Entry<Integer, String> entry = map.entrySet().iterator().next();
+        final Pair<Integer, String> pair = ImmutablePair.of(entry);
+        assertEquals(entry.getKey(), pair.getLeft());
+        assertEquals(entry.getValue(), pair.getRight());
+    }
+
+    @Test
+    public void testPairOfObjects() {
         final ImmutablePair<Integer, String> pair = ImmutablePair.of(0, "foo");
         assertEquals(0, pair.left.intValue());
         assertEquals(0, pair.getLeft().intValue());
@@ -132,6 +154,9 @@ public class ImmutablePairTest {
         assertNull(pair2.getLeft());
         assertEquals("bar", pair2.right);
         assertEquals("bar", pair2.getRight());
+        ImmutablePair pair3 = ImmutablePair.of(null, null);
+        assertNull(pair3.left);
+        assertNull(pair3.right);
     }
 
     @Test
diff --git a/src/test/java/org/apache/commons/lang3/tuple/MutablePairTest.java 
b/src/test/java/org/apache/commons/lang3/tuple/MutablePairTest.java
index 7bf734b..731f178 100644
--- a/src/test/java/org/apache/commons/lang3/tuple/MutablePairTest.java
+++ b/src/test/java/org/apache/commons/lang3/tuple/MutablePairTest.java
@@ -24,6 +24,8 @@ import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.ObjectInputStream;
 import java.io.ObjectOutputStream;
+import java.util.HashMap;
+import java.util.Map.Entry;
 
 import org.junit.jupiter.api.Test;
 
@@ -47,12 +49,28 @@ public class MutablePairTest {
 
     @Test
     public void testBasic() {
-        final MutablePair<Integer, String> pair = new MutablePair<>(0, "foo");
-        assertEquals(0, pair.getLeft().intValue());
-        assertEquals("foo", pair.getRight());
-        final MutablePair<Object, String> pair2 = new MutablePair<>(null, 
"bar");
-        assertNull(pair2.getLeft());
-        assertEquals("bar", pair2.getRight());
+        MutablePair<Integer, String> oldPair = new MutablePair<>(0, "foo");
+        MutablePair<Integer, String> nowPair;
+        for (int i=0; i<4; i++) {
+            nowPair = MutablePair.of(oldPair);
+            assertEquals(0, nowPair.left.intValue());
+            assertEquals(0, nowPair.getLeft().intValue());
+            assertEquals("foo", nowPair.right);
+            assertEquals("foo", nowPair.getRight());
+            assertEquals(oldPair, nowPair);
+            oldPair = nowPair;
+        }
+
+        MutablePair<Object, String> oldPair2 = new MutablePair<>(null, "bar");
+        MutablePair<Object, String> nowPair2;
+        for (int i=0; i<4; i++) {
+            nowPair2 = MutablePair.of(oldPair2);
+            assertNull(nowPair2.left);
+            assertNull(nowPair2.getLeft());
+            assertEquals("bar", nowPair2.right);
+            assertEquals("bar", nowPair2.getRight());
+            oldPair2 = nowPair2;
+        }
     }
 
     @Test
@@ -88,13 +106,26 @@ public class MutablePairTest {
     }
 
     @Test
-    public void testPairOf() {
+    public void testPairOfMapEntry() {
+        final HashMap<Integer, String> map = new HashMap<>();
+        map.put(0, "foo");
+        final Entry<Integer, String> entry = map.entrySet().iterator().next();
+        final Pair<Integer, String> pair = MutablePair.of(entry);
+        assertEquals(entry.getKey(), pair.getLeft());
+        assertEquals(entry.getValue(), pair.getRight());
+    }
+
+    @Test
+    public void testPairOfObjects() {
         final MutablePair<Integer, String> pair = MutablePair.of(0, "foo");
         assertEquals(0, pair.getLeft().intValue());
         assertEquals("foo", pair.getRight());
         final MutablePair<Object, String> pair2 = MutablePair.of(null, "bar");
         assertNull(pair2.getLeft());
         assertEquals("bar", pair2.getRight());
+        MutablePair pair3 = MutablePair.of(null, null);
+        assertNull(pair3.left);
+        assertNull(pair3.right);
     }
 
     @Test
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 ff3ccaf..6ec78cc 100644
--- a/src/test/java/org/apache/commons/lang3/tuple/PairTest.java
+++ b/src/test/java/org/apache/commons/lang3/tuple/PairTest.java
@@ -104,7 +104,17 @@ public class PairTest {
     }
 
     @Test
-    public void testPairOf() {
+    public void testPairOfMapEntry() {
+        final HashMap<Integer, String> map = new HashMap<>();
+        map.put(0, "foo");
+        final Entry<Integer, String> entry = map.entrySet().iterator().next();
+        final Pair<Integer, String> pair = Pair.of(entry);
+        assertEquals(entry.getKey(), pair.getLeft());
+        assertEquals(entry.getValue(), pair.getRight());
+    }
+
+    @Test
+    public void testPairOfObjects() {
         final Pair<Integer, String> pair = Pair.of(0, "foo");
         assertTrue(pair instanceof ImmutablePair<?, ?>);
         assertEquals(0, ((ImmutablePair<Integer, String>) 
pair).left.intValue());
@@ -113,6 +123,9 @@ public class PairTest {
         assertTrue(pair2 instanceof ImmutablePair<?, ?>);
         assertNull(((ImmutablePair<Object, String>) pair2).left);
         assertEquals("bar", ((ImmutablePair<Object, String>) pair2).right);
+        Pair pair3 = Pair.of(null, null);
+        assertNull(pair3.getLeft());
+        assertNull(pair3.getRight());
     }
 
     @Test

Reply via email to