This commit is contained in:
Looly
2023-04-25 17:57:23 +08:00
parent bd97a73cb9
commit a6f01e75c6
7 changed files with 133 additions and 10 deletions

View File

@@ -22,6 +22,7 @@ import org.dromara.hutool.core.reflect.TypeUtil;
import java.io.Serializable;
import java.lang.reflect.Type;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Objects;
@@ -80,7 +81,8 @@ public class MapConverter implements Converter, Serializable {
return (Map) value;
}
}
map = MapUtil.createMap(TypeUtil.getClass(targetType));
map = MapUtil.createMap(TypeUtil.getClass(targetType), LinkedHashMap::new);
convertMapToMap(keyType, valueType, (Map) value, map);
} else if (BeanUtil.isBean(value.getClass())) {
map = BeanUtil.beanToMap(value);

View File

@@ -24,10 +24,7 @@ import org.dromara.hutool.core.util.ObjUtil;
import java.util.*;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.UnaryOperator;
import java.util.function.*;
import java.util.stream.Collectors;
/**
@@ -240,16 +237,30 @@ public class MapUtil extends MapGetUtil {
* @param mapType map类型
* @return {@link Map}实例
*/
@SuppressWarnings("unchecked")
public static <K, V> Map<K, V> createMap(final Class<?> mapType) {
return createMap(mapType, HashMap::new);
}
/**
* 创建Map<br>
* 传入抽象Map{@link AbstractMap}和{@link Map}类将默认创建{@link HashMap}
*
* @param <K> map键类型
* @param <V> map值类型
* @param mapType map类型
* @param defaultMap 如果通过反射创建失败或提供的是抽象Map则创建的默认Map
* @return {@link Map}实例
*/
@SuppressWarnings("unchecked")
public static <K, V> Map<K, V> createMap(final Class<?> mapType, final Supplier<Map<K, V>> defaultMap) {
if (null == mapType || mapType.isAssignableFrom(AbstractMap.class)) {
return new HashMap<>();
return defaultMap.get();
} else {
try {
return (Map<K, V>) ConstructorUtil.newInstance(mapType);
} catch (final Exception e) {
// 不支持的map类型返回默认的HashMap
return new HashMap<>();
return defaultMap.get();
}
}
}

View File

@@ -0,0 +1,45 @@
/*
* Copyright (c) 2023 looly(loolly@aliyun.com)
* Hutool is licensed under Mulan PSL v2.
* You can use this software according to the terms and conditions of the Mulan PSL v2.
* You may obtain a copy of Mulan PSL v2 at:
* http://license.coscl.org.cn/MulanPSL2
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PSL v2 for more details.
*/
package org.dromara.hutool.core.data;
import org.dromara.hutool.core.date.DateField;
import org.dromara.hutool.core.date.DateRange;
import org.dromara.hutool.core.date.DateTime;
import org.dromara.hutool.core.date.DateUtil;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import java.util.ArrayList;
import java.util.List;
public class Issue3081Test {
@Test
void dateRangeTest() {
final DateTime start = DateUtil.parse("2023-01-01 00:00:00");
final DateTime end = DateUtil.parse("2023-04-25 00:00:00");
final DateRange dateTimes = new DateRange(start, end, DateField.DAY_OF_MONTH, 30, true, true);
final List<DateTime> dateTimeList = new ArrayList<>();
while (dateTimes.hasNext()) {
dateTimeList.add(dateTimes.next());
}
Assertions.assertEquals(4, dateTimeList.size());
Assertions.assertEquals(DateUtil.parse("2023-01-01 00:00:00"), dateTimeList.get(0));
Assertions.assertEquals(DateUtil.parse("2023-01-31 00:00:00"), dateTimeList.get(1));
Assertions.assertEquals(DateUtil.parse("2023-03-02 00:00:00"), dateTimeList.get(2));
Assertions.assertEquals(DateUtil.parse("2023-04-01 00:00:00"), dateTimeList.get(3));
}
}