mirror of
https://gitee.com/dromara/hutool.git
synced 2025-04-24 18:04:54 +08:00
修复MapUtil工具使用filter方法构造传入参数结果问题
This commit is contained in:
parent
4f17d18e05
commit
e205d2659a
@ -253,16 +253,21 @@ public class MapUtil extends MapGetUtil {
|
||||
*/
|
||||
@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 defaultMap.get();
|
||||
} else {
|
||||
try {
|
||||
return (Map<K, V>) ConstructorUtil.newInstance(mapType);
|
||||
} catch (final Exception e) {
|
||||
// 不支持的map类型,返回默认的HashMap
|
||||
return defaultMap.get();
|
||||
}
|
||||
Map<K, V> result = null;
|
||||
if (null != mapType && !mapType.isAssignableFrom(AbstractMap.class)) {
|
||||
result = (Map<K, V>) ConstructorUtil.newInstanceIfPossible(mapType);
|
||||
}
|
||||
|
||||
if(null == result){
|
||||
result = defaultMap.get();
|
||||
}
|
||||
|
||||
if(!result.isEmpty()){
|
||||
// issue#3162@Github,在构造中put值,会导致新建map带有值内容,此处清空
|
||||
result.clear();
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------------------------- value of
|
||||
@ -657,16 +662,12 @@ public class MapUtil extends MapGetUtil {
|
||||
* @param editor 编辑器接口
|
||||
* @return 编辑后的Map
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
public static <K, V> Map<K, V> edit(final Map<K, V> map, final UnaryOperator<Entry<K, V>> editor) {
|
||||
if (null == map || null == editor) {
|
||||
return map;
|
||||
}
|
||||
|
||||
Map<K, V> map2 = ConstructorUtil.newInstanceIfPossible(map.getClass());
|
||||
if (null == map2) {
|
||||
map2 = new HashMap<>(map.size(), 1f);
|
||||
}
|
||||
final Map<K, V> map2 = createMap(map.getClass(), ()-> new HashMap<>(map.size(), 1f));
|
||||
if (isEmpty(map)) {
|
||||
return map2;
|
||||
}
|
||||
@ -681,6 +682,8 @@ public class MapUtil extends MapGetUtil {
|
||||
return map2;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 过滤<br>
|
||||
* 过滤过程通过传入的Editor实现来返回需要的元素内容,这个Filter实现可以实现以下功能:
|
||||
@ -739,10 +742,7 @@ public class MapUtil extends MapGetUtil {
|
||||
return map;
|
||||
}
|
||||
|
||||
Map<K, V> map2 = ConstructorUtil.newInstanceIfPossible(map.getClass());
|
||||
if (null == map2) {
|
||||
map2 = new HashMap<>(map.size(), 1f);
|
||||
}
|
||||
final Map<K, V> map2 = createMap(map.getClass(), ()-> new HashMap<>(map.size(), 1f));
|
||||
if (isEmpty(map)) {
|
||||
return map2;
|
||||
}
|
||||
|
@ -292,4 +292,19 @@ public class MapUtilTest {
|
||||
final Map<String, Object> map = MapUtil.removeNullValue(v1);
|
||||
Assertions.assertEquals(1, map.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void issue3162Test() {
|
||||
final Map<String, Object> map = new HashMap<String, Object>() {
|
||||
private static final long serialVersionUID = 1L;
|
||||
{
|
||||
put("a", "1");
|
||||
put("b", "2");
|
||||
put("c", "3");
|
||||
}};
|
||||
final Map<String, Object> filtered = MapUtil.filter(map, "a", "b");
|
||||
Assertions.assertEquals(2, filtered.size());
|
||||
Assertions.assertEquals("1", filtered.get("a"));
|
||||
Assertions.assertEquals("2", filtered.get("b"));
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user