From d1dea5c88ef600fd8d7d3a0a412b98ad1637df58 Mon Sep 17 00:00:00 2001 From: Looly Date: Thu, 3 Mar 2022 21:52:30 +0800 Subject: [PATCH] fix bug --- .../cn/hutool/core/collection/CollUtil.java | 14 ++--------- .../main/java/cn/hutool/core/map/MapUtil.java | 25 +++++-------------- .../java/cn/hutool/core/map/MapWrapper.java | 13 +++++++++- .../java/cn/hutool/core/util/ReflectUtil.java | 2 +- .../java/cn/hutool/core/map/MapUtilTest.java | 18 +++++++++++++ 5 files changed, 39 insertions(+), 33 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java b/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java index dd22d5275..21120cd25 100644 --- a/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java @@ -1178,20 +1178,10 @@ public class CollUtil { return collection; } - Collection collection2 = ObjectUtil.clone(collection); - if (null == collection2) { - // 不支持clone - collection2 = create(collection.getClass()); - } - if (isEmpty(collection2)) { + final Collection collection2 = create(collection.getClass()); + if (isEmpty(collection)) { return collection2; } - try { - collection2.clear(); - } catch (UnsupportedOperationException e) { - // 克隆后的对象不支持清空,说明为不可变集合对象,使用默认的ArrayList保存结果 - collection2 = new ArrayList<>(); - } T modified; for (T t : collection) { diff --git a/hutool-core/src/main/java/cn/hutool/core/map/MapUtil.java b/hutool-core/src/main/java/cn/hutool/core/map/MapUtil.java index b0fb79250..194777224 100644 --- a/hutool-core/src/main/java/cn/hutool/core/map/MapUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/MapUtil.java @@ -7,7 +7,6 @@ import cn.hutool.core.lang.Filter; import cn.hutool.core.lang.Pair; import cn.hutool.core.lang.TypeReference; import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.StrUtil; @@ -623,25 +622,19 @@ public class MapUtil { * @param editor 编辑器接口 * @return 编辑后的Map */ + @SuppressWarnings("unchecked") public static Map edit(Map map, Editor> editor) { if (null == map || null == editor) { return map; } - Map map2 = ObjectUtil.clone(map); + Map map2 = ReflectUtil.newInstanceIfPossible(map.getClass()); if(null == map2){ - // 不支持clone map2 = new HashMap<>(map.size(), 1f); } - if (isEmpty(map2)) { + if (isEmpty(map)) { return map2; } - try { - map2.clear(); - } catch (UnsupportedOperationException e) { - // 克隆后的对象不支持清空,说明为不可变集合对象,使用默认的ArrayList保存结果 - map2 = new HashMap<>(map.size(), 1f); - } Entry modified; for (Entry entry : map.entrySet()) { @@ -690,20 +683,14 @@ public class MapUtil { if(null == map || null == keys){ return map; } - Map map2 = ObjectUtil.clone(map); + + Map map2 = ReflectUtil.newInstanceIfPossible(map.getClass()); if(null == map2){ - // 不支持clone map2 = new HashMap<>(map.size(), 1f); } - if (isEmpty(map2)) { + if (isEmpty(map)) { return map2; } - try { - map2.clear(); - } catch (UnsupportedOperationException e) { - // 克隆后的对象不支持清空,说明为不可变集合对象,使用默认的ArrayList保存结果 - map2 = new HashMap<>(); - } for (K key : keys) { if (map.containsKey(key)) { diff --git a/hutool-core/src/main/java/cn/hutool/core/map/MapWrapper.java b/hutool-core/src/main/java/cn/hutool/core/map/MapWrapper.java index 000b15ea6..bfd81dd86 100644 --- a/hutool-core/src/main/java/cn/hutool/core/map/MapWrapper.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/MapWrapper.java @@ -1,5 +1,7 @@ package cn.hutool.core.map; +import cn.hutool.core.util.ObjectUtil; + import java.io.Serializable; import java.util.Collection; import java.util.Iterator; @@ -30,7 +32,7 @@ public class MapWrapper implements Map, Iterable>, S */ protected static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 - private final Map raw; + private Map raw; /** * 构造 @@ -199,5 +201,14 @@ public class MapWrapper implements Map, Iterable>, S public V merge(K key, V value, BiFunction remappingFunction) { return raw.merge(key, value, remappingFunction); } + + @Override + public MapWrapper clone() throws CloneNotSupportedException { + @SuppressWarnings("unchecked") + final MapWrapper clone = (MapWrapper) super.clone(); + clone.raw = ObjectUtil.clone(raw); + return clone; + } + //---------------------------------------------------------------------------- Override default methods end } diff --git a/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java index 6f3176433..43440bb32 100644 --- a/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/ReflectUtil.java @@ -848,7 +848,7 @@ public class ReflectUtil { * * @param 对象类型 * @param beanClass 被构造的类 - * @return 构造后的对象 + * @return 构造后的对象,构造失败返回{@code null} */ @SuppressWarnings("unchecked") public static T newInstanceIfPossible(Class beanClass) { diff --git a/hutool-core/src/test/java/cn/hutool/core/map/MapUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/map/MapUtilTest.java index 19fdc8316..ed47980fe 100644 --- a/hutool-core/src/test/java/cn/hutool/core/map/MapUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/map/MapUtilTest.java @@ -26,6 +26,24 @@ public class MapUtilTest { Assert.assertEquals("4", map2.get("d")); } + @Test + public void filterMapWrapperTest() { + Map map = MapUtil.newHashMap(); + map.put("a", "1"); + map.put("b", "2"); + map.put("c", "3"); + map.put("d", "4"); + + final Map camelCaseMap = MapUtil.toCamelCaseMap(map); + + Map map2 = MapUtil.filter(camelCaseMap, t -> Convert.toInt(t.getValue()) % 2 == 0); + + Assert.assertEquals(2, map2.size()); + + Assert.assertEquals("2", map2.get("b")); + Assert.assertEquals("4", map2.get("d")); + } + @Test public void filterContainsTest() { Map map = MapUtil.newHashMap();