This commit is contained in:
Looly
2024-09-19 01:47:21 +08:00
parent c489cc7735
commit bc3f6cf1ee
35 changed files with 296 additions and 576 deletions

View File

@@ -454,7 +454,6 @@ public class BeanUtil {
* @param ignoreProperties 不拷贝的的属性列表
* @return 目标对象
*/
@SuppressWarnings("unchecked")
public static <T> T copyProperties(final Object source, final Class<T> tClass, final String... ignoreProperties) {
if (null == source) {
return null;
@@ -462,7 +461,7 @@ public class BeanUtil {
if (RecordUtil.isRecord(tClass)) {
// issue#I7EO3U
// 转换record时ignoreProperties无效
return (T) RecordConverter.INSTANCE.convert(tClass, source);
return RecordConverter.INSTANCE.convert(tClass, source);
}
final T target = ConstructorUtil.newInstanceIfPossible(tClass);
return copyProperties(source, target, CopyOptions.of().setIgnoreProperties(ignoreProperties));

View File

@@ -1955,7 +1955,7 @@ public class CollUtil {
* @param consumer {@link SerBiConsumer} 遍历的每条数据处理器
* @since 5.4.7
*/
public static <T> void forEach(final Iterable<T> iterable, final SerBiConsumer<T, Integer> consumer) {
public static <T> void forEach(final Iterable<T> iterable, final SerBiConsumer<Integer, T> consumer) {
if (iterable == null) {
return;
}
@@ -1969,13 +1969,13 @@ public class CollUtil {
* @param iterator {@link Iterator}
* @param consumer {@link SerBiConsumer} 遍历的每条数据处理器
*/
public static <T> void forEach(final Iterator<T> iterator, final SerBiConsumer<T, Integer> consumer) {
public static <T> void forEach(final Iterator<T> iterator, final SerBiConsumer<Integer, T> consumer) {
if (iterator == null) {
return;
}
int index = 0;
while (iterator.hasNext()) {
consumer.accept(iterator.next(), index);
consumer.accept(index, iterator.next());
index++;
}
}
@@ -1987,13 +1987,13 @@ public class CollUtil {
* @param enumeration {@link Enumeration}
* @param consumer {@link SerBiConsumer} 遍历的每条数据处理器
*/
public static <T> void forEach(final Enumeration<T> enumeration, final SerBiConsumer<T, Integer> consumer) {
public static <T> void forEach(final Enumeration<T> enumeration, final SerBiConsumer<Integer, T> consumer) {
if (enumeration == null) {
return;
}
int index = 0;
while (enumeration.hasMoreElements()) {
consumer.accept(enumeration.nextElement(), index);
consumer.accept(index, enumeration.nextElement());
index++;
}
}
@@ -2007,13 +2007,13 @@ public class CollUtil {
* @param map {@link Map}
* @param kvConsumer {@link SerConsumer3} 遍历的每条数据处理器
*/
public static <K, V> void forEach(final Map<K, V> map, final SerConsumer3<K, V, Integer> kvConsumer) {
public static <K, V> void forEach(final Map<K, V> map, final SerConsumer3<Integer, K, V> kvConsumer) {
if (map == null) {
return;
}
int index = 0;
for (final Entry<K, V> entry : map.entrySet()) {
kvConsumer.accept(entry.getKey(), entry.getValue(), index);
kvConsumer.accept(index, entry.getKey(), entry.getValue());
index++;
}
}

View File

@@ -191,4 +191,21 @@ public class ListWrapper<E> extends SimpleWrapper<List<E>> implements List<E> {
public Stream<E> parallelStream() {
return raw.parallelStream();
}
@Override
public int hashCode() {
return this.raw.hashCode();
}
@Override
public boolean equals(final Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
final ListWrapper<?> that = (ListWrapper<?>) obj;
return Objects.equals(raw, that.raw);
}
}

View File

@@ -561,10 +561,9 @@ public class ConvertUtil {
* @param defaultValue 默认值
* @return Enum
*/
@SuppressWarnings("unchecked")
public static <E extends Enum<E>> E toEnum(final Class<E> clazz, final Object value, final E defaultValue) {
try {
return (E) EnumConverter.INSTANCE.convert(clazz, value);
return EnumConverter.INSTANCE.convert(clazz, value);
} catch (final Exception ignore) {
return defaultValue;
}

View File

@@ -40,6 +40,21 @@ public interface Converter {
*/
Object convert(Type targetType, Object value) throws ConvertException;
/**
* 转换为指定类型<br>
* 如果类型无法确定,将读取默认值的类型做为目标类型
*
* @param <T> 目标类型
* @param targetType 目标类型
* @param value 原始值如果对象实现了此接口则value为this
* @return 转换后的值
* @throws ConvertException 转换无法正常完成或转换异常时抛出此异常
*/
@SuppressWarnings("unchecked")
default <T> T convert(final Class<T> targetType, final Object value) throws ConvertException {
return (T) convert((Type) targetType, value);
}
/**
* 转换值为指定类型,可选是否不抛异常转换<br>
* 当转换失败时返回默认值
@@ -57,9 +72,10 @@ public interface Converter {
/**
* 返回原值的转换器,不做转换
*
* @return Converter
*/
static Converter identity(){
static Converter identity() {
return (targetType, value) -> value;
}
}

View File

@@ -37,7 +37,7 @@ public class TupleConverter implements Converter {
@Override
public Object convert(final Type targetType, final Object value) throws ConvertException {
final Object[] convert = (Object[]) ArrayConverter.INSTANCE.convert(Object[].class, value);
final Object[] convert = ArrayConverter.INSTANCE.convert(Object[].class, value);
return Tuple.of(convert);
}
}

View File

@@ -321,7 +321,7 @@ public class CollUtilTest {
final String[] result = new String[1];
final String a = "a";
CollUtil.forEach(map, (key, value, index) -> {
CollUtil.forEach(map, (index, key, value) -> {
if (a.equals(key)) {
result[0] = value;
}

View File

@@ -32,7 +32,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull;
public class CompositeConverterTest {
@Test
void convertEmptyTest() {
final Object convert = CompositeConverter.getInstance().convert(EmptyBean.class, "");
final EmptyBean convert = CompositeConverter.getInstance().convert(EmptyBean.class, "");
assertNotNull(convert);
assertEquals(new EmptyBean(), convert);
}
@@ -45,13 +45,13 @@ public class CompositeConverterTest {
final int a = 454553;
final CompositeConverter compositeConverter = CompositeConverter.getInstance();
CharSequence result = (CharSequence) compositeConverter.convert(CharSequence.class, a);
CharSequence result = compositeConverter.convert(CharSequence.class, a);
assertEquals("454553", result);
//此处做为示例自定义CharSequence转换因为Hutool中已经提供CharSequence转换请尽量不要替换
//替换可能引发关联转换异常例如覆盖CharSequence转换会影响全局
compositeConverter.register(CharSequence.class, new CustomConverter());
result = (CharSequence) compositeConverter.convert(CharSequence.class, a);
result = compositeConverter.convert(CharSequence.class, a);
assertEquals("Custom: 454553", result);
}

View File

@@ -131,28 +131,28 @@ public class ConvertTest {
final String a = " 34232";
final Integer aInteger = ConvertUtil.toInt(a);
assertEquals(Integer.valueOf(34232), aInteger);
final int aInt = (int) CompositeConverter.getInstance().convert(int.class, a);
final int aInt = CompositeConverter.getInstance().convert(int.class, a);
assertEquals(34232, aInt);
// 带小数测试
final String b = " 34232.00";
final Integer bInteger = ConvertUtil.toInt(b);
assertEquals(Integer.valueOf(34232), bInteger);
final int bInt = (int) CompositeConverter.getInstance().convert(int.class, b);
final int bInt = CompositeConverter.getInstance().convert(int.class, b);
assertEquals(34232, bInt);
// boolean测试
final boolean c = true;
final Integer cInteger = ConvertUtil.toInt(c);
assertEquals(Integer.valueOf(1), cInteger);
final int cInt = (int) CompositeConverter.getInstance().convert(int.class, c);
final int cInt = CompositeConverter.getInstance().convert(int.class, c);
assertEquals(1, cInt);
// boolean测试
final String d = "08";
final Integer dInteger = ConvertUtil.toInt(d);
assertEquals(Integer.valueOf(8), dInteger);
final int dInt = (int) CompositeConverter.getInstance().convert(int.class, d);
final int dInt = CompositeConverter.getInstance().convert(int.class, d);
assertEquals(8, dInt);
}
@@ -176,28 +176,28 @@ public class ConvertTest {
final String a = " 342324545435435";
final Long aLong = ConvertUtil.toLong(a);
assertEquals(Long.valueOf(342324545435435L), aLong);
final long aLong2 = (long) CompositeConverter.getInstance().convert(long.class, a);
final long aLong2 = CompositeConverter.getInstance().convert(long.class, a);
assertEquals(342324545435435L, aLong2);
// 带小数测试
final String b = " 342324545435435.245435435";
final Long bLong = ConvertUtil.toLong(b);
assertEquals(Long.valueOf(342324545435435L), bLong);
final long bLong2 = (long) CompositeConverter.getInstance().convert(long.class, b);
final long bLong2 = CompositeConverter.getInstance().convert(long.class, b);
assertEquals(342324545435435L, bLong2);
// boolean测试
final boolean c = true;
final Long cLong = ConvertUtil.toLong(c);
assertEquals(Long.valueOf(1), cLong);
final long cLong2 = (long) CompositeConverter.getInstance().convert(long.class, c);
final long cLong2 = CompositeConverter.getInstance().convert(long.class, c);
assertEquals(1, cLong2);
// boolean测试
final String d = "08";
final Long dLong = ConvertUtil.toLong(d);
assertEquals(Long.valueOf(8), dLong);
final long dLong2 = (long) CompositeConverter.getInstance().convert(long.class, d);
final long dLong2 = CompositeConverter.getInstance().convert(long.class, d);
assertEquals(8, dLong2);
}

View File

@@ -95,11 +95,11 @@ public class ConvertToArrayTest {
//数组转数组测试
final int[] a = new int[]{1,2,3,4};
final long[] result = (long[]) CompositeConverter.getInstance().convert(long[].class, a);
final long[] result = CompositeConverter.getInstance().convert(long[].class, a);
Assertions.assertArrayEquals(new long[]{1L, 2L, 3L, 4L}, result);
//数组转数组测试
final byte[] resultBytes = (byte[]) CompositeConverter.getInstance().convert(byte[].class, a);
final byte[] resultBytes = CompositeConverter.getInstance().convert(byte[].class, a);
Assertions.assertArrayEquals(new byte[]{1, 2, 3, 4}, resultBytes);
//字符串转数组

View File

@@ -31,7 +31,7 @@ public class EntryConvertTest {
final KVBean kvBean = new KVBean();
kvBean.setKey("a");
kvBean.setValue(1);
final AbstractMap.SimpleEntry<?, ?> entry = (AbstractMap.SimpleEntry<?, ?>) CompositeConverter.getInstance()
final AbstractMap.SimpleEntry<?, ?> entry = CompositeConverter.getInstance()
.convert(AbstractMap.SimpleEntry.class, kvBean);
Assertions.assertEquals("a", entry.getKey());
@@ -42,7 +42,7 @@ public class EntryConvertTest {
void beanToEntryTest2() {
final SingleBean bean = new SingleBean();
bean.setA("1");
final AbstractMap.SimpleEntry<?, ?> entry = (AbstractMap.SimpleEntry<?, ?>) CompositeConverter.getInstance()
final AbstractMap.SimpleEntry<?, ?> entry = CompositeConverter.getInstance()
.convert(AbstractMap.SimpleEntry.class, bean);
Assertions.assertEquals("a", entry.getKey());
@@ -53,7 +53,7 @@ public class EntryConvertTest {
void mapToEntryTest() {
final Map<String, Integer> bean = new HashMap<>();
bean.put("a", 1);
final AbstractMap.SimpleEntry<?, ?> entry = (AbstractMap.SimpleEntry<?, ?>) CompositeConverter.getInstance()
final AbstractMap.SimpleEntry<?, ?> entry = CompositeConverter.getInstance()
.convert(AbstractMap.SimpleEntry.class, bean);
Assertions.assertEquals("a", entry.getKey());
@@ -63,7 +63,7 @@ public class EntryConvertTest {
@Test
void strToEntryTest() {
final String bean = "a=1";
final AbstractMap.SimpleEntry<?, ?> entry = (AbstractMap.SimpleEntry<?, ?>) CompositeConverter.getInstance()
final AbstractMap.SimpleEntry<?, ?> entry = CompositeConverter.getInstance()
.convert(AbstractMap.SimpleEntry.class, bean);
Assertions.assertEquals("a", entry.getKey());
@@ -73,7 +73,7 @@ public class EntryConvertTest {
@Test
void strToEntryTest2() {
final String bean = "a:1";
final AbstractMap.SimpleEntry<?, ?> entry = (AbstractMap.SimpleEntry<?, ?>) CompositeConverter.getInstance()
final AbstractMap.SimpleEntry<?, ?> entry = CompositeConverter.getInstance()
.convert(AbstractMap.SimpleEntry.class, bean);
Assertions.assertEquals("a", entry.getKey());
@@ -83,7 +83,7 @@ public class EntryConvertTest {
@Test
void strToEntryTest3() {
final String bean = "a,1";
final AbstractMap.SimpleEntry<?, ?> entry = (AbstractMap.SimpleEntry<?, ?>) CompositeConverter.getInstance()
final AbstractMap.SimpleEntry<?, ?> entry = CompositeConverter.getInstance()
.convert(AbstractMap.SimpleEntry.class, bean);
Assertions.assertEquals("a", entry.getKey());