From bf3376f46403c94b39a22905929e71191df306f2 Mon Sep 17 00:00:00 2001 From: Looly Date: Wed, 30 Jul 2025 19:14:30 +0800 Subject: [PATCH] =?UTF-8?q?`MapUtil`=E5=A2=9E=E5=8A=A0flatten=E6=96=B9?= =?UTF-8?q?=E6=B3=95=EF=BC=88pr#1368@Gitee=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/hutool/v7/core/map/MapUtil.java | 49 +++++++++++++++++-- .../cn/hutool/v7/core/stream/EasyStream.java | 2 + 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/hutool-core/src/main/java/cn/hutool/v7/core/map/MapUtil.java b/hutool-core/src/main/java/cn/hutool/v7/core/map/MapUtil.java index 6110d97de..d5bd36b02 100644 --- a/hutool-core/src/main/java/cn/hutool/v7/core/map/MapUtil.java +++ b/hutool-core/src/main/java/cn/hutool/v7/core/map/MapUtil.java @@ -389,9 +389,9 @@ public class MapUtil extends MapGetUtil { final HashMap map = new HashMap<>((int) (array.length * 1.5)); for (int i = 0; i < array.length; i++) { final Object object = array[i]; - if (object instanceof Map.Entry entry) { + if (object instanceof final Map.Entry entry) { map.put(entry.getKey(), entry.getValue()); - } else if (object instanceof Object[] entry) { + } else if (object instanceof final Object[] entry) { if (entry.length > 1) { map.put(entry[0], entry[1]); } @@ -404,7 +404,7 @@ public class MapUtil extends MapGetUtil { map.put(key, value); } } - } else if (object instanceof Iterator iter) { + } else if (object instanceof final Iterator iter) { if (iter.hasNext()) { final Object key = iter.next(); if (iter.hasNext()) { @@ -838,7 +838,7 @@ public class MapUtil extends MapGetUtil { return null; } - if (map instanceof TreeMap result) { + if (map instanceof final TreeMap result) { // 已经是可排序Map,此时只有比较器一致才返回原map if (null == comparator || comparator.equals(result.comparator())) { return result; @@ -1399,4 +1399,45 @@ public class MapUtil extends MapGetUtil { index++; } } + + /** + * 将多层级Map处理为一个层级Map类型 + * + * @param map 入参Map + * @return 单层级Map返回值 + * @param 键类型 + * @param 值类型 + */ + public static Map flatten(final Map map) { + return flatten(map, new HashMap<>()); + } + + /** + * 递归调用将多层级Map处理为一个层级Map类型 + * + * @param map 入参Map + * @param flatMap 单层级Map返回值 + * @param 键类型 + * @param 值类型 + * @return 单层级Map返回值 + */ + @SuppressWarnings("unchecked") + public static Map flatten(final Map map, Map flatMap) { + Assert.notNull(map); + if(null == flatMap){ + flatMap = new HashMap<>(); + } + + final Map finalFlatMap = flatMap; + map.forEach((k, v) -> { + // 避免嵌套循环 + if (v instanceof Map && v != map) { + flatten((Map) v, finalFlatMap); + } else { + finalFlatMap.put(k, v); + } + }); + + return flatMap; + } } diff --git a/hutool-core/src/main/java/cn/hutool/v7/core/stream/EasyStream.java b/hutool-core/src/main/java/cn/hutool/v7/core/stream/EasyStream.java index 3e5c0e225..639a3495f 100644 --- a/hutool-core/src/main/java/cn/hutool/v7/core/stream/EasyStream.java +++ b/hutool-core/src/main/java/cn/hutool/v7/core/stream/EasyStream.java @@ -22,6 +22,7 @@ import cn.hutool.v7.core.lang.Opt; import cn.hutool.v7.core.math.NumberUtil; import cn.hutool.v7.core.util.ObjUtil; +import java.io.Serial; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.Collection; @@ -100,6 +101,7 @@ public class EasyStream extends AbstractEnhancedWrappedStream Builder builder() { return new Builder() { + @Serial private static final long serialVersionUID = 1L; private final Stream.Builder streamBuilder = Stream.builder();