Improve the robustness of `Arrays.concat`
diff --git a/src/main/java/org/apache/groovy/util/Arrays.java b/src/main/java/org/apache/groovy/util/Arrays.java
index 67b8abb..de3f85e 100644
--- a/src/main/java/org/apache/groovy/util/Arrays.java
+++ b/src/main/java/org/apache/groovy/util/Arrays.java
@@ -28,7 +28,7 @@
public class Arrays {
/**
- * Concatenate arrays
+ * Concatenate arrays and ignore null array
*
* @param arrays arrays to merge
* @param <T> array component type
@@ -36,13 +36,20 @@
*/
@SuppressWarnings("unchecked")
public static <T> T[] concat(T[]... arrays) {
- if (0 == arrays.length) return null;
+ if (null == arrays || 0 == arrays.length) return null;
- int resultLength = java.util.Arrays.stream(arrays).map(e -> e.length).reduce(0, Integer::sum);
+ int resultLength =
+ java.util.Arrays.stream(arrays)
+ .filter(e -> null != e)
+ .map(e -> e.length)
+ .reduce(0, Integer::sum);
T[] resultArray = (T[]) Array.newInstance(arrays[0].getClass().getComponentType(), resultLength);
for (int i = 0, n = arrays.length, curr = 0; i < n; i++) {
T[] array = arrays[i];
+
+ if (null == array) continue;
+
int length = array.length;
System.arraycopy(array, 0, resultArray, curr, length);
curr += length;
diff --git a/src/test/org/apache/groovy/util/ArraysTest.java b/src/test/org/apache/groovy/util/ArraysTest.java
index 37ca71b..f6e15d3 100644
--- a/src/test/org/apache/groovy/util/ArraysTest.java
+++ b/src/test/org/apache/groovy/util/ArraysTest.java
@@ -25,6 +25,7 @@
@Test
public void testConcat0() {
Assert.assertNull(Arrays.concat());
+ Assert.assertNull(Arrays.concat(null));
}
@Test
@@ -38,7 +39,7 @@
@Test
public void testConcat2() {
Integer[] a = new Integer[] {1, 2};
- Integer[] b = new Integer[0];
+ Integer[] b = null;
Integer[] result = Arrays.concat(a, b);
Assert.assertNotSame(a, result);
Assert.assertArrayEquals(new Integer[] {1, 2}, result);
@@ -47,13 +48,22 @@
@Test
public void testConcat3() {
Integer[] a = new Integer[] {1, 2};
+ Integer[] b = new Integer[0];
+ Integer[] result = Arrays.concat(a, b);
+ Assert.assertNotSame(a, result);
+ Assert.assertArrayEquals(new Integer[] {1, 2}, result);
+ }
+
+ @Test
+ public void testConcat4() {
+ Integer[] a = new Integer[] {1, 2};
Integer[] b = new Integer[] {3, 4};
Integer[] result = Arrays.concat(a, b);
Assert.assertArrayEquals(new Integer[] {1, 2, 3, 4}, result);
}
@Test
- public void testConcat4() {
+ public void testConcat5() {
Integer[] a = new Integer[] {1, 2};
Integer[] b = new Integer[] {3, 4};
Integer[] c = new Integer[] {5, 6, 7, 8, 9};