add method

This commit is contained in:
Looly 2022-10-17 11:36:28 +08:00
parent d2b08250ff
commit 3e21370503
2 changed files with 87 additions and 11 deletions

View File

@ -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}元素<br>
* 如果列表是{@code null}或者空返回{@code false}否则当列表中有非{@code null}字符时返回{@code true}
*
* @param <T> 数组元素类型
* @param array 被检查的数组
* @return 是否包含非{@code null}元素
* @since 5.4.0
*/
@SuppressWarnings("unchecked")
public static <T> boolean hasNonNull(final T... array) {
return null != firstNonNull(array);
}
/**
* 返回数组中第一个非空元素
*
@ -317,15 +332,18 @@ public class ArrayUtil extends PrimitiveArrayUtil {
* 将新元素添加到已有数组中<br>
* 添加新元素会生成一个新的数组不影响原数组
*
* @param <A> 数组类型
* @param <T> 数组元素类型
* @param array 已有数组
* @param newElements 新元素
* @return 新数组
*/
@SuppressWarnings("unchecked")
@SafeVarargs
public static <T> Object append(final Object array, final T... newElements) {
public static <A, T> 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 <A> 数组类型
* @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> 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 {
* 添加新元素会生成一个新的数组不影响原数组<br>
* 如果插入位置为为负数从原数组从后向前计数若大于原数组长度则空白处用null填充
*
* @param <A> 数组类型
* @param <T> 数组元素类型
* @param array 已有数组
* @param index 插入位置此位置为对应此位置元素之前的空档
@ -444,12 +464,12 @@ public class ArrayUtil extends PrimitiveArrayUtil {
* @since 4.0.8
*/
@SuppressWarnings({"unchecked", "SuspiciousSystemArraycopy"})
public static <T> Object insert(final Object array, int index, final T... newElements) {
public static <A, T> 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 <T> 元素类型
* @param <T> 元素类型
* @param args 被检查的对象,一个或者多个
* @return 是否都为空
* @since 4.5.18

View File

@ -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));
}
}