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/12 20:40:56 UTC

[commons-lang] 02/02: [LANG-1569] Add ArrayUtils.get(T[], index, T) to provide an out-of-bounds default value

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 5b699d076518cbf2dddc286f65cb06d0873dae16
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Fri Jun 12 16:40:49 2020 -0400

    [LANG-1569] Add ArrayUtils.get(T[], index, T) to provide an
    out-of-bounds default value
---
 src/changes/changes.xml                            |  1 +
 .../java/org/apache/commons/lang3/ArrayUtils.java  | 33 ++++++++++
 .../org/apache/commons/lang3/ArrayUtilsTest.java   | 73 +++++++++++++---------
 3 files changed, 77 insertions(+), 30 deletions(-)

diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index c34b0f6..61fc572 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -61,6 +61,7 @@ The <action> type attribute can be add,update,fix,remove.
     <action issue="LANG-1545" type="update" dev="ggregory" due-to="XenoAmess, Gary Gregory">CharSequenceUtils.regionMatches is wrong dealing with Georgian.</action>
     <action                   type="add" dev="jochen">Added the Locks class as a convenient possibility to deal with locked objects.</action>
     <action issue="LANG-1568" type="add" dev="ggregory">Add to Functions: FailableBooleanSupplier, FailableIntSupplier, FailableLongSupplier, FailableDoubleSupplier, and so on.</action>
+    <action issue="LANG-1569" type="add" dev="ggregory">Add ArrayUtils.get(T[], index, T) to provide an out-of-bounds default value.</action>
   </release>
 
   <release version="3.10" date="2020-03-22" description="New features and bug fixes. Requires Java 8, supports Java 9, 10, 11.">
diff --git a/src/main/java/org/apache/commons/lang3/ArrayUtils.java b/src/main/java/org/apache/commons/lang3/ArrayUtils.java
index c620c79..074341a 100644
--- a/src/main/java/org/apache/commons/lang3/ArrayUtils.java
+++ b/src/main/java/org/apache/commons/lang3/ArrayUtils.java
@@ -1655,6 +1655,39 @@ public class ArrayUtils {
         return Array.newInstance(newArrayComponentType, 1);
     }
 
+    /**
+     * Gets the nTh element of an array or null if the index is out of bounds or the array is null.
+     * 
+     * @param <T> The type of array elements.
+     * @param array The array to index.
+     * @param index The index
+     * @return the nTh element of an array or null if the index is out of bounds or the array is null.
+     * @since 3.11
+     */
+    public static <T> T get(final T[] array, final int index) {
+        return get(array, index, null);
+    }
+
+    /**
+     * Gets the nTh element of an array or a default value if the index is out of bounds.
+     * 
+     * @param <T> The type of array elements.
+     * @param array The array to index.
+     * @param index The index
+     * @param defaultValue The return value of the given index is out of bounds.
+     * @return the nTh element of an array or a default value if the index is out of bounds.
+     * @since 3.11
+     */
+    public static <T> T get(final T[] array, final int index, T defaultValue) {
+        if (array == null) {
+            return defaultValue;
+        }
+        if (index >= 0 && index < array.length) {
+            return array[index];
+        }
+        return defaultValue;
+    }
+
     //-----------------------------------------------------------------------
     /**
      * <p>Returns the length of the specified array.
diff --git a/src/test/java/org/apache/commons/lang3/ArrayUtilsTest.java b/src/test/java/org/apache/commons/lang3/ArrayUtilsTest.java
index 686f464..ffa076d 100644
--- a/src/test/java/org/apache/commons/lang3/ArrayUtilsTest.java
+++ b/src/test/java/org/apache/commons/lang3/ArrayUtilsTest.java
@@ -47,16 +47,15 @@ public class ArrayUtilsTest {
 
     private class TestClass {
     }
-
+    
     /** A predefined seed used to initialize {@link Random} in order to get predictable results */
     private static final long SEED = 16111981L;
-
+    
     @SafeVarargs
     private static <T> T[] toArrayPropagatingType(final T... items) {
         return ArrayUtils.toArray(items);
     }
 
-    //-----------------------------------------------------------------------
     private void assertIsEquals(final Object array1, final Object array2, final Object array3) {
         assertTrue(ArrayUtils.isEquals(array1, array1));
         assertTrue(ArrayUtils.isEquals(array2, array2));
@@ -69,7 +68,6 @@ public class ArrayUtilsTest {
         assertFalse(ArrayUtils.isEquals(array2, array1));
     }
 
-    //-----------------------------------------------------------------------
     /**
      * Tests generic array creation with parameters of same type.
      */
@@ -101,7 +99,6 @@ public class ArrayUtilsTest {
         assertTrue(obj instanceof String[]);
     }
 
-    //-----------------------------------------------------------------------
     @Test
     public void testClone() {
         assertArrayEquals(null, ArrayUtils.clone((Object[]) null));
@@ -192,7 +189,6 @@ public class ArrayUtilsTest {
         assertNotSame(original, cloned);
     }
 
-    //-----------------------------------------------------------------------
     @Test
     public void testConstructor() {
         assertNotNull(new ArrayUtils());
@@ -281,8 +277,6 @@ public class ArrayUtilsTest {
         assertFalse(ArrayUtils.contains(array, (double) 99));
     }
 
-    //-----------------------------------------------------------------------
-
     @SuppressWarnings("cast")
     @Test
     public void testContainsDoubleTolerance() {
@@ -363,7 +357,47 @@ public class ArrayUtilsTest {
         assertEquals(0, array.length);
     }
 
-    // ------------------------------------------------------------------------
+    @Test
+    public void testGet() {
+        assertNull(ArrayUtils.get(null, -1));
+        assertNull(ArrayUtils.get(null, 0));
+        assertNull(ArrayUtils.get(null, 1));
+        final String[] array0 = {};
+        assertNull(ArrayUtils.get(array0, -1));
+        assertNull(ArrayUtils.get(array0, 0));
+        assertNull(ArrayUtils.get(array0, 1));
+        final String[] array1 = { StringUtils.EMPTY };
+        assertEquals(null, ArrayUtils.get(array1, -1));
+        assertEquals(StringUtils.EMPTY, ArrayUtils.get(array1, 0));
+        assertEquals(null, ArrayUtils.get(array1, 1));
+    }
+
+    @Test
+    public void testGetDefault() {
+        // null default
+        {
+            assertNull(ArrayUtils.get(null, -1, null));
+            assertNull(ArrayUtils.get(null, 0, null));
+            assertNull(ArrayUtils.get(null, 1, null));
+            final String[] array0 = {};
+            assertNull(ArrayUtils.get(array0, -1, null));
+            assertNull(ArrayUtils.get(array0, 0, null));
+            assertNull(ArrayUtils.get(array0, 1, null));
+            final String[] array1 = { StringUtils.EMPTY };
+            assertEquals(null, ArrayUtils.get(array1, -1, null));
+            assertEquals(StringUtils.EMPTY, ArrayUtils.get(array1, 0, null));
+            assertEquals(null, ArrayUtils.get(array1, 1, null));
+        }
+        // non-null default
+        {
+            final String defaultValue = "defaultValue";
+            final String[] array1 = { StringUtils.EMPTY };
+            assertEquals(defaultValue, ArrayUtils.get(array1, -1, defaultValue));
+            assertEquals(StringUtils.EMPTY, ArrayUtils.get(array1, 0, defaultValue));
+            assertEquals(defaultValue, ArrayUtils.get(array1, 1, defaultValue));
+        }
+    }
+
     @Test
     public void testGetLength() {
         assertEquals(0, ArrayUtils.getLength(null));
@@ -419,7 +453,6 @@ public class ArrayUtilsTest {
         assertThrows(IllegalArgumentException.class, () -> ArrayUtils.getLength("notAnArray"));
     }
 
-    //-----------------------------------------------------------------------
     @Test
     public void testHashCode() {
         final long[][] array1 = new long[][]{{2, 5}, {4, 5}};
@@ -885,7 +918,6 @@ public class ArrayUtilsTest {
 
     }
 
-    //-----------------------------------------------------------------------
     @Test
     public void testIndexOf() {
         final Object[] array = new Object[]{"0", "1", "2", "3", null, "0"};
@@ -900,7 +932,6 @@ public class ArrayUtilsTest {
         assertEquals(-1, ArrayUtils.indexOf(array, "notInArray"));
     }
 
-    //-----------------------------------------------------------------------
     @Test
     public void testIndexOfBoolean() {
         boolean[] array = null;
@@ -930,7 +961,6 @@ public class ArrayUtilsTest {
         assertEquals(-1, ArrayUtils.indexOf(array, false, -1));
     }
 
-    //-----------------------------------------------------------------------
     @Test
     public void testIndexOfByte() {
         byte[] array = null;
@@ -957,7 +987,6 @@ public class ArrayUtilsTest {
         assertEquals(-1, ArrayUtils.indexOf(array, (byte) 0, 6));
     }
 
-    //-----------------------------------------------------------------------
     @Test
     public void testIndexOfChar() {
         char[] array = null;
@@ -984,7 +1013,6 @@ public class ArrayUtilsTest {
         assertEquals(-1, ArrayUtils.indexOf(array, 'a', 6));
     }
 
-    //-----------------------------------------------------------------------
     @SuppressWarnings("cast")
     @Test
     public void testIndexOfDouble() {
@@ -1049,7 +1077,6 @@ public class ArrayUtilsTest {
         assertEquals(1, ArrayUtils.indexOf(array, 1.00001324, -300, 0.0001));
     }
 
-    //-----------------------------------------------------------------------
     @SuppressWarnings("cast")
     @Test
     public void testIndexOfFloat() {
@@ -1082,7 +1109,6 @@ public class ArrayUtilsTest {
         assertEquals(-1, ArrayUtils.indexOf(array, (float) 0, 6));
     }
 
-    //-----------------------------------------------------------------------
     @Test
     public void testIndexOfInt() {
         int[] array = null;
@@ -1109,7 +1135,6 @@ public class ArrayUtilsTest {
         assertEquals(-1, ArrayUtils.indexOf(array, 0, 6));
     }
 
-    //-----------------------------------------------------------------------
     @Test
     public void testIndexOfLong() {
         long[] array = null;
@@ -1136,7 +1161,6 @@ public class ArrayUtilsTest {
         assertEquals(-1, ArrayUtils.indexOf(array, 0, 6));
     }
 
-    //-----------------------------------------------------------------------
     @Test
     public void testIndexOfShort() {
         short[] array = null;
@@ -1505,8 +1529,6 @@ public class ArrayUtilsTest {
         assertFalse(ArrayUtils.isSorted(array));
     }
 
-    //-----------------------------------------------------------------------
-
     @Test
     public void testIsSortedFloat() {
         float[] array = null;
@@ -2249,7 +2271,6 @@ public class ArrayUtilsTest {
         assertArrayEquals(ArrayUtils.EMPTY_STRING_ARRAY, ArrayUtils.nullToEmpty((String[]) null));
     }
 
-    //-----------------------------------------------------------------------
     @Test
     public void testReverse() {
         final StringBuffer str1 = new StringBuffer("pick");
@@ -2667,7 +2688,6 @@ public class ArrayUtilsTest {
         assertNull(array);
     }
 
-    //-----------------------------------------------------------------------
     @Test
     public void testSameLength() {
         final Object[] nullArray = null;
@@ -4256,7 +4276,6 @@ public class ArrayUtilsTest {
         assertTrue(ArrayUtils.isSameLength(twoArray, twoArray));
     }
 
-    //-----------------------------------------------------------------------
     @Test
     public void testSameType() {
         assertThrows(IllegalArgumentException.class, () -> ArrayUtils.isSameType(null, null));
@@ -4469,7 +4488,6 @@ public class ArrayUtilsTest {
         assertEquals(2, array[3]);
     }
 
-    //-----------------------------------------------------------------------
     @Test
     public void testShiftDouble() {
         final double[] array = new double[]{1, 2, 3, 4};
@@ -5545,7 +5563,6 @@ public class ArrayUtilsTest {
         assertEquals(3, array[2]);
     }
 
-    //-----------------------------------------------------------------------
     @Test
     public void testSwapChar() {
         char[] array = new char[]{1, 2, 3};
@@ -6034,7 +6051,6 @@ public class ArrayUtilsTest {
         assertEquals(3, array[2]);
     }
 
-    //-----------------------------------------------------------------------
     @Test
     public void testToMap() {
         Map<?, ?> map = ArrayUtils.toMap(new String[][]{{"foo", "bar"}, {"hello", "world"}});
@@ -6090,8 +6106,6 @@ public class ArrayUtilsTest {
         assertEquals(Collections.singletonMap("key", "value1"), map);
     }
 
-    //-----------------------------------------------------------------------
-
     @Test
     public void testToObject_boolean() {
         final boolean[] b = null;
@@ -6447,7 +6461,6 @@ public class ArrayUtilsTest {
                 Short.valueOf((short) 9999999)}, Short.MAX_VALUE));
     }
 
-    //-----------------------------------------------------------------------
     @Test
     public void testToString() {
         assertEquals("{}", ArrayUtils.toString(null));