diff --git a/hutool-core/src/main/java/org/dromara/hutool/core/map/MapUtil.java b/hutool-core/src/main/java/org/dromara/hutool/core/map/MapUtil.java index 0246ad9e8..bd732887a 100644 --- a/hutool-core/src/main/java/org/dromara/hutool/core/map/MapUtil.java +++ b/hutool-core/src/main/java/org/dromara/hutool/core/map/MapUtil.java @@ -253,16 +253,21 @@ public class MapUtil extends MapGetUtil { */ @SuppressWarnings("unchecked") public static Map createMap(final Class mapType, final Supplier> defaultMap) { - if (null == mapType || mapType.isAssignableFrom(AbstractMap.class)) { - return defaultMap.get(); - } else { - try { - return (Map) ConstructorUtil.newInstance(mapType); - } catch (final Exception e) { - // 不支持的map类型,返回默认的HashMap - return defaultMap.get(); - } + Map result = null; + if (null != mapType && !mapType.isAssignableFrom(AbstractMap.class)) { + result = (Map) 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 Map edit(final Map map, final UnaryOperator> editor) { if (null == map || null == editor) { return map; } - Map map2 = ConstructorUtil.newInstanceIfPossible(map.getClass()); - if (null == map2) { - map2 = new HashMap<>(map.size(), 1f); - } + final Map 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; } + + /** * 过滤
* 过滤过程通过传入的Editor实现来返回需要的元素内容,这个Filter实现可以实现以下功能: @@ -739,10 +742,7 @@ public class MapUtil extends MapGetUtil { return map; } - Map map2 = ConstructorUtil.newInstanceIfPossible(map.getClass()); - if (null == map2) { - map2 = new HashMap<>(map.size(), 1f); - } + final Map map2 = createMap(map.getClass(), ()-> new HashMap<>(map.size(), 1f)); if (isEmpty(map)) { return map2; } diff --git a/hutool-core/src/test/java/org/dromara/hutool/core/map/MapUtilTest.java b/hutool-core/src/test/java/org/dromara/hutool/core/map/MapUtilTest.java index e58db6ffc..c2726b91c 100644 --- a/hutool-core/src/test/java/org/dromara/hutool/core/map/MapUtilTest.java +++ b/hutool-core/src/test/java/org/dromara/hutool/core/map/MapUtilTest.java @@ -292,4 +292,19 @@ public class MapUtilTest { final Map map = MapUtil.removeNullValue(v1); Assertions.assertEquals(1, map.size()); } + + @Test + public void issue3162Test() { + final Map map = new HashMap() { + private static final long serialVersionUID = 1L; + { + put("a", "1"); + put("b", "2"); + put("c", "3"); + }}; + final Map filtered = MapUtil.filter(map, "a", "b"); + Assertions.assertEquals(2, filtered.size()); + Assertions.assertEquals("1", filtered.get("a")); + Assertions.assertEquals("2", filtered.get("b")); + } }