diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java
index 530656cd4..2e48d0097 100755
--- a/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/util/ArrayUtil.java
@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.collection.UniqueKeySet;
import cn.hutool.core.comparator.CompareUtil;
+import cn.hutool.core.convert.Convert;
import cn.hutool.core.exceptions.UtilException;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.map.MapUtil;
@@ -139,6 +140,20 @@ public class ArrayUtil extends PrimitiveArrayUtil {
return null == firstNonNull(array);
}
+ /**
+ * 是否包含非{@code null}元素
+ * 如果列表是{@code null}或者空,返回{@code false},否则当列表中有非{@code null}字符时返回{@code true}
+ *
+ * @param 数组元素类型
+ * @param array 被检查的数组
+ * @return 是否包含非{@code null}元素
+ * @since 5.4.0
+ */
+ @SuppressWarnings("unchecked")
+ public static boolean hasNonNull(final T... array) {
+ return null != firstNonNull(array);
+ }
+
/**
* 返回数组中第一个非空元素
*
@@ -317,15 +332,18 @@ public class ArrayUtil extends PrimitiveArrayUtil {
* 将新元素添加到已有数组中
* 添加新元素会生成一个新的数组,不影响原数组
*
+ * @param 数组类型
* @param 数组元素类型
* @param array 已有数组
* @param newElements 新元素
* @return 新数组
*/
+ @SuppressWarnings("unchecked")
@SafeVarargs
- public static Object append(final Object array, final T... newElements) {
+ public static A append(final A array, final T... newElements) {
if (isEmpty(array)) {
- return newElements;
+ // 可变长参数可能为包装类型,如果array是原始类型,则此处强转不合适,采用万能转换器完成转换
+ return (A) Convert.convert(array.getClass(), newElements);
}
return insert(array, length(array), newElements);
}
@@ -357,13 +375,14 @@ public class ArrayUtil extends PrimitiveArrayUtil {
/**
* 将元素值设置为数组的某个位置,当给定的index大于数组长度,则追加
*
+ * @param 数组类型
* @param array 已有数组
* @param index 位置,大于长度追加,否则替换
* @param value 新值
* @return 新数组或原有数组
* @since 4.1.2
*/
- public static Object setOrAppend(final Object array, final int index, final Object value) {
+ public static A setOrAppend(final A array, final int index, final Object value) {
if (index < length(array)) {
Array.set(array, index, value);
return array;
@@ -436,6 +455,7 @@ public class ArrayUtil extends PrimitiveArrayUtil {
* 添加新元素会生成一个新的数组,不影响原数组
* 如果插入位置为为负数,从原数组从后向前计数,若大于原数组长度,则空白处用null填充
*
+ * @param 数组类型
* @param 数组元素类型
* @param array 已有数组
* @param index 插入位置,此位置为对应此位置元素之前的空档
@@ -444,12 +464,12 @@ public class ArrayUtil extends PrimitiveArrayUtil {
* @since 4.0.8
*/
@SuppressWarnings({"unchecked", "SuspiciousSystemArraycopy"})
- public static Object insert(final Object array, int index, final T... newElements) {
+ public static A insert(final A array, int index, final T... newElements) {
if (isEmpty(newElements)) {
return array;
}
if (isEmpty(array)) {
- return newElements;
+ return (A) Convert.convert(array.getClass(), newElements);
}
final int len = length(array);
@@ -457,13 +477,13 @@ public class ArrayUtil extends PrimitiveArrayUtil {
index = (index % len) + len;
}
- final T[] result = newArray(array.getClass().getComponentType(), Math.max(len, index) + newElements.length);
+ final Object result = Array.newInstance(array.getClass().getComponentType(), Math.max(len, index) + newElements.length);
System.arraycopy(array, 0, result, 0, Math.min(len, index));
System.arraycopy(newElements, 0, result, index, newElements.length);
if (index < len) {
System.arraycopy(array, index, result, index + newElements.length, len - index);
}
- return result;
+ return (A) result;
}
/**
@@ -496,6 +516,7 @@ public class ArrayUtil extends PrimitiveArrayUtil {
* @param newSize 新的数组大小
* @return 调整后的新数组
* @since 4.6.7
+ * @see System#arraycopy(Object, int, Object, int, int)
*/
public static Object resize(final Object array, final int newSize) {
if (newSize < 0) {
@@ -1572,7 +1593,7 @@ public class ArrayUtil extends PrimitiveArrayUtil {
/**
* 是否存都为{@code null}或空对象,通过{@link ObjUtil#isEmpty(Object)} 判断元素
*
- * @param 元素类型
+ * @param 元素类型
* @param args 被检查的对象,一个或者多个
* @return 是否都为空
* @since 4.5.18
diff --git a/hutool-core/src/test/java/cn/hutool/core/util/ArrayUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/ArrayUtilTest.java
index 46a21f528..ca992b7ca 100755
--- a/hutool-core/src/test/java/cn/hutool/core/util/ArrayUtilTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/util/ArrayUtilTest.java
@@ -63,6 +63,9 @@ public class ArrayUtilTest {
public void newArrayTest() {
final String[] newArray = ArrayUtil.newArray(String.class, 3);
Assert.assertEquals(3, newArray.length);
+
+ final Object[] newArray2 = ArrayUtil.newArray(3);
+ Assert.assertEquals(3, newArray2.length);
}
@Test
@@ -508,10 +511,20 @@ public class ArrayUtilTest {
}
@Test
- public void setOrAppendTest(){
- String[] arr = new String[0];
- String[] newArr = ArrayUtil.setOrAppend(arr, 0, "Good");// ClassCastException
+ public void setOrAppendTest() {
+ final String[] arr = new String[0];
+ final String[] newArr = ArrayUtil.setOrAppend(arr, 0, "Good");// ClassCastException
Assert.assertArrayEquals(new String[]{"Good"}, newArr);
+
+ // 非空数组替换第一个元素
+ int[] arr2 = new int[]{1};
+ int[] o = ArrayUtil.setOrAppend(arr2, 0, 2);
+ Assert.assertArrayEquals(new int[]{2}, o);
+
+ // 空数组追加
+ arr2 = new int[0];
+ o = ArrayUtil.setOrAppend(arr2, 0, 2);
+ Assert.assertArrayEquals(new int[]{2}, o);
}
@Test
@@ -522,4 +535,46 @@ public class ArrayUtilTest {
final String[] c = {"d", "e"};
Assert.assertTrue(ArrayUtil.containsAll(c, resultO[0], resultO[1]));
}
+
+ @Test
+ public void hasNonNullTest() {
+ String[] a = {null, "e"};
+ Assert.assertTrue(ArrayUtil.hasNonNull(a));
+
+ a = new String[]{null, null};
+ Assert.assertFalse(ArrayUtil.hasNonNull(a));
+
+ a = new String[]{"", null};
+ Assert.assertTrue(ArrayUtil.hasNonNull(a));
+
+ a = new String[]{null};
+ Assert.assertFalse(ArrayUtil.hasNonNull(a));
+
+ a = new String[]{};
+ Assert.assertFalse(ArrayUtil.hasNonNull(a));
+
+ a = null;
+ Assert.assertFalse(ArrayUtil.hasNonNull(a));
+ }
+
+ @Test
+ public void isAllNullTest() {
+ String[] a = {null, "e"};
+ Assert.assertFalse(ArrayUtil.isAllNull(a));
+
+ a = new String[]{null, null};
+ Assert.assertTrue(ArrayUtil.isAllNull(a));
+
+ a = new String[]{"", null};
+ Assert.assertFalse(ArrayUtil.isAllNull(a));
+
+ a = new String[]{null};
+ Assert.assertTrue(ArrayUtil.isAllNull(a));
+
+ a = new String[]{};
+ Assert.assertTrue(ArrayUtil.isAllNull(a));
+
+ a = null;
+ Assert.assertTrue(ArrayUtil.isAllNull(a));
+ }
}