mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-07-21 15:09:48 +08:00
add param
This commit is contained in:
@@ -19,6 +19,7 @@
|
||||
* 【core 】 增加Calculator(issue#1090@Github)
|
||||
* 【core 】 IdcardUtil增加getIdcardInfo方法(issue#1092@Github)
|
||||
* 【core 】 改进ObjectUtil.equal,支持BigDecimal判断
|
||||
* 【core 】 ArrayConverter增加可选是否忽略错误(issue#I1VNYQ@Gitee)
|
||||
|
||||
### Bug修复
|
||||
* 【core 】 修复Dict.of错误(issue#I1UUO5@Gitee)
|
||||
|
@@ -350,11 +350,7 @@ public class ConverterRegistry implements Serializable {
|
||||
// 数组转换
|
||||
if (rowType.isArray()) {
|
||||
final ArrayConverter arrayConverter = new ArrayConverter(rowType);
|
||||
try {
|
||||
return (T) arrayConverter.convert(value, defaultValue);
|
||||
} catch (Exception e) {
|
||||
// 数组转换失败进行下一步
|
||||
}
|
||||
}
|
||||
|
||||
// 表示非需要特殊转换的对象
|
||||
|
@@ -2,7 +2,7 @@ package cn.hutool.core.convert.impl;
|
||||
|
||||
import cn.hutool.core.collection.IterUtil;
|
||||
import cn.hutool.core.convert.AbstractConverter;
|
||||
import cn.hutool.core.convert.ConverterRegistry;
|
||||
import cn.hutool.core.convert.Convert;
|
||||
import cn.hutool.core.util.ArrayUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
@@ -22,15 +22,32 @@ public class ArrayConverter extends AbstractConverter<Object> {
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private final Class<?> targetType;
|
||||
/** 目标元素类型 */
|
||||
/**
|
||||
* 目标元素类型
|
||||
*/
|
||||
private final Class<?> targetComponentType;
|
||||
|
||||
/**
|
||||
* 是否忽略元素转换错误
|
||||
*/
|
||||
private boolean ignoreElementError;
|
||||
|
||||
/**
|
||||
* 构造
|
||||
*
|
||||
* @param targetType 目标数组类型
|
||||
*/
|
||||
public ArrayConverter(Class<?> targetType) {
|
||||
this(targetType, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* 构造
|
||||
*
|
||||
* @param targetType 目标数组类型
|
||||
* @param ignoreElementError 是否忽略元素转换错误
|
||||
*/
|
||||
public ArrayConverter(Class<?> targetType, boolean ignoreElementError) {
|
||||
if (null == targetType) {
|
||||
// 默认Object数组
|
||||
targetType = Object[].class;
|
||||
@@ -44,6 +61,8 @@ public class ArrayConverter extends AbstractConverter<Object> {
|
||||
this.targetComponentType = targetType;
|
||||
this.targetType = ArrayUtil.getArrayType(targetType);
|
||||
}
|
||||
|
||||
this.ignoreElementError = ignoreElementError;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -57,7 +76,18 @@ public class ArrayConverter extends AbstractConverter<Object> {
|
||||
return this.targetType;
|
||||
}
|
||||
|
||||
/**
|
||||
* 设置是否忽略元素转换错误
|
||||
*
|
||||
* @param ignoreElementError 是否忽略元素转换错误
|
||||
* @since 5.4.3
|
||||
*/
|
||||
public void setIgnoreElementError(boolean ignoreElementError) {
|
||||
this.ignoreElementError = ignoreElementError;
|
||||
}
|
||||
|
||||
// -------------------------------------------------------------------------------------- Private method start
|
||||
|
||||
/**
|
||||
* 数组对数组转换
|
||||
*
|
||||
@@ -74,9 +104,8 @@ public class ArrayConverter extends AbstractConverter<Object> {
|
||||
final int len = ArrayUtil.length(array);
|
||||
final Object result = Array.newInstance(targetComponentType, len);
|
||||
|
||||
final ConverterRegistry converter = ConverterRegistry.getInstance();
|
||||
for (int i = 0; i < len; i++) {
|
||||
Array.set(result, i, converter.convert(targetComponentType, Array.get(array, i)));
|
||||
Array.set(result, i, convertComponentType(Array.get(array, i)));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
@@ -98,14 +127,13 @@ public class ArrayConverter extends AbstractConverter<Object> {
|
||||
return convertArrayToArray(strings);
|
||||
}
|
||||
|
||||
final ConverterRegistry converter = ConverterRegistry.getInstance();
|
||||
Object result;
|
||||
if (value instanceof List) {
|
||||
// List转数组
|
||||
final List<?> list = (List<?>) value;
|
||||
result = Array.newInstance(targetComponentType, list.size());
|
||||
for (int i = 0; i < list.size(); i++) {
|
||||
Array.set(result, i, converter.convert(targetComponentType, list.get(i)));
|
||||
Array.set(result, i, convertComponentType(list.get(i)));
|
||||
}
|
||||
} else if (value instanceof Collection) {
|
||||
// 集合转数组
|
||||
@@ -114,7 +142,7 @@ public class ArrayConverter extends AbstractConverter<Object> {
|
||||
|
||||
int i = 0;
|
||||
for (Object element : collection) {
|
||||
Array.set(result, i, converter.convert(targetComponentType, element));
|
||||
Array.set(result, i, convertComponentType(element));
|
||||
i++;
|
||||
}
|
||||
} else if (value instanceof Iterable) {
|
||||
@@ -122,14 +150,14 @@ public class ArrayConverter extends AbstractConverter<Object> {
|
||||
final List<?> list = IterUtil.toList((Iterable<?>) value);
|
||||
result = Array.newInstance(targetComponentType, list.size());
|
||||
for (int i = 0; i < list.size(); i++) {
|
||||
Array.set(result, i, converter.convert(targetComponentType, list.get(i)));
|
||||
Array.set(result, i, convertComponentType(list.get(i)));
|
||||
}
|
||||
} else if (value instanceof Iterator) {
|
||||
// 可循环对象转数组,可循环对象无法获取长度,因此先转为List后转为数组
|
||||
final List<?> list = IterUtil.toList((Iterator<?>) value);
|
||||
result = Array.newInstance(targetComponentType, list.size());
|
||||
for (int i = 0; i < list.size(); i++) {
|
||||
Array.set(result, i, converter.convert(targetComponentType, list.get(i)));
|
||||
Array.set(result, i, convertComponentType(list.get(i)));
|
||||
}
|
||||
} else if (value instanceof Serializable && byte.class == targetComponentType) {
|
||||
// 用户可能想序列化指定对象
|
||||
@@ -150,8 +178,19 @@ public class ArrayConverter extends AbstractConverter<Object> {
|
||||
*/
|
||||
private Object[] convertToSingleElementArray(Object value) {
|
||||
final Object[] singleElementArray = ArrayUtil.newArray(targetComponentType, 1);
|
||||
singleElementArray[0] = ConverterRegistry.getInstance().convert(targetComponentType, value);
|
||||
singleElementArray[0] = convertComponentType(value);
|
||||
return singleElementArray;
|
||||
}
|
||||
|
||||
/**
|
||||
* 转换元素类型
|
||||
*
|
||||
* @param value 值
|
||||
* @return 转换后的值,转换失败若{@link #ignoreElementError}为true,返回null,否则抛出异常
|
||||
* @since 5.4.3
|
||||
*/
|
||||
private Object convertComponentType(Object value) {
|
||||
return Convert.convertWithCheck(this.targetComponentType, value, null, this.ignoreElementError);
|
||||
}
|
||||
// -------------------------------------------------------------------------------------- Private method end
|
||||
}
|
||||
|
@@ -1,16 +1,15 @@
|
||||
package cn.hutool.core.convert;
|
||||
|
||||
import java.io.File;
|
||||
import java.net.URL;
|
||||
import java.util.ArrayList;
|
||||
|
||||
import org.junit.Assert;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
|
||||
import cn.hutool.core.convert.impl.ArrayConverter;
|
||||
import cn.hutool.core.io.FileUtil;
|
||||
import cn.hutool.core.lang.Console;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.io.File;
|
||||
import java.net.URL;
|
||||
import java.util.ArrayList;
|
||||
|
||||
/**
|
||||
* 类型转换工具单元测试<br>
|
||||
@@ -36,6 +35,15 @@ public class ConvertToArrayTest {
|
||||
Assert.assertArrayEquals(intArray2, new Integer[]{1,2,3,4,5});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void toIntArrayTestIgnoreComponentErrorTest() {
|
||||
String[] b = { "a", "1" };
|
||||
|
||||
final ArrayConverter arrayConverter = new ArrayConverter(Integer[].class, true);
|
||||
Integer[] integerArray = (Integer[]) arrayConverter.convert(b, null);
|
||||
Assert.assertArrayEquals(integerArray, new Integer[]{null, 1});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void toLongArrayTest() {
|
||||
String[] b = { "1", "2", "3", "4" };
|
||||
|
Reference in New Issue
Block a user