package com.tudicloud.framework.common.core.util.core;

import java.text.NumberFormat;
import java.text.ParseException;
import java.util.HashMap;
import java.util.Map;

/**
 * Map工具类,提供常用的Map操作方法。
 *
 * @Author 孙达
 * @Date 2025/11/14 14:08
 * @Wechat sundaain
 * @Email 18211102099@163.com
 * @Copyright <a href="https://www.sundablog.com">孙达博客</a>
 */
public class MapUtils {

    // ---------------------- empty check ----------------------

    /**
     * 判断给定的Map是否为空(null 或 size == 0)。
     *
     * @param map 要检查的Map对象
     * @return 如果Map为null或没有元素则返回true;否则返回false
     */
    public static boolean isEmpty(final Map<?,?> map) {
        return map == null || map.isEmpty();
    }

    /**
     * 判断给定的Map是否不为空。
     *
     * @param map 要检查的Map对象
     * @return 如果Map不为null且至少有一个元素则返回true;否则返回false
     */
    public static boolean isNotEmpty(final Map<?,?> map) {
        return !isEmpty(map);
    }

    // ---------------------- type safe getter ----------------------

    /**
     * 获取指定键对应的字符串值。
     *
     * @param map 包含数据的Map
     * @param key 键名
     * @param <K> 泛型类型参数,表示键的类型
     * @return 对应键的字符串形式值,如果不存在或为null则返回null
     */
    public static <K> String getString(final Map<? super K, ?> map, final K key) {
        if (map != null) {
            final Object value = map.get(key);
            if (value != null) {
                return value.toString();
            }
        }
        return null;
    }

    /**
     * 获取指定键对应的布尔值。
     *
     * @param map 包含数据的Map
     * @param key 键名
     * @param <K> 泛型类型参数,表示键的类型
     * @return 布尔类型的值。支持从Boolean、String、Number转换而来。
     *         若无法解析或值为null,则返回null。
     */
    public static <K> Boolean getBoolean(final Map<? super K, ?> map, final K key) {
        if (map != null) {
            final Object value = map.get(key);
            if (value != null) {
                if (value instanceof Boolean) {
                    return (Boolean) value;
                }
                if (value instanceof String) {
                    return Boolean.valueOf((String) value);
                }
                if (value instanceof Number) {
                    final Number n = (Number) value;
                    return n.intValue() != 0 ? Boolean.TRUE : Boolean.FALSE;
                }
            }
        }
        return null;
    }

    /**
     * 获取指定键对应的数值(Number)值。
     *
     * @param map 包含数据的Map
     * @param key 键名
     * @param <K> 泛型类型参数,表示键的类型
     * @return 数字类型的值。支持从Number和可解析的String中获取。
     *         若无法解析或值为null,则返回null。
     */
    public static <K> Number getNumber(final Map<? super K, ?> map, final K key) {
        if (map != null) {
            final Object value = map.get(key);
            if (value != null) {
                if (value instanceof Number) {
                    return (Number) value;
                }
                if (value instanceof String) {
                    try {
                        final String text = (String) value;
                        return NumberFormat.getInstance().parse(text);
                    } catch (final ParseException e) { // NOPMD
                        // failure means null is returned
                    }
                }
            }
        }
        return null;
    }

    /**
     * 获取指定键对应的字节(Byte)值。
     *
     * @param map 包含数据的Map
     * @param key 键名
     * @param <K> 泛型类型参数,表示键的类型
     * @return 字节类型的值。若原始值不是Byte类型但可以转成Number,
     *         将通过Number.byteValue()进行转换。
     *         若无法解析或值为null,则返回null。
     */
    public static <K> Byte getByte(final Map<? super K, ?> map, final K key) {
        final Number value = getNumber(map, key);
        if (value == null) {
            return null;
        }
        if (value instanceof Byte) {
            return (Byte) value;
        }
        return Byte.valueOf(value.byteValue());
    }

    /**
     * 获取指定键对应的短整型(Short)值。
     *
     * @param map 包含数据的Map
     * @param key 键名
     * @param <K> 泛型类型参数,表示键的类型
     * @return 短整型的值。若原始值不是Short类型但可以转成Number,
     *         将通过Number.shortValue()进行转换。
     *         若无法解析或值为null,则返回null。
     */
    public static <K> Short getShort(final Map<? super K, ?> map, final K key) {
        final Number value = getNumber(map, key);
        if (value == null) {
            return null;
        }
        if (value instanceof Short) {
            return (Short) value;
        }
        return Short.valueOf(value.shortValue());
    }

    /**
     * 获取指定键对应的整数(Integer)值。
     *
     * @param map 包含数据的Map
     * @param key 键名
     * @param <K> 泛型类型参数,表示键的类型
     * @return 整数类型的值。若原始值不是Integer类型但可以转成Number,
     *         将通过Number.intValue()进行转换。
     *         若无法解析或值为null,则返回null。
     */
    public static <K> Integer getInteger(final Map<? super K, ?> map, final K key) {
        final Number value = getNumber(map, key);
        if (value == null) {
            return null;
        }
        if (value instanceof Integer) {
            return (Integer) value;
        }
        return Integer.valueOf(value.intValue());
    }

    /**
     * 获取指定键对应的长整型(Long)值。
     *
     * @param map 包含数据的Map
     * @param key 键名
     * @param <K> 泛型类型参数,表示键的类型
     * @return 长整型的值。若原始值不是Long类型但可以转成Number,
     *         将通过Number.longValue()进行转换。
     *         若无法解析或值为null,则返回null。
     */
    public static <K> Long getLong(final Map<? super K, ?> map, final K key) {
        final Number value = getNumber(map, key);
        if (value == null) {
            return null;
        }
        if (value instanceof Long) {
            return (Long) value;
        }
        return Long.valueOf(value.longValue());
    }

    /**
     * 获取指定键对应的浮点(Float)值。
     *
     * @param map 包含数据的Map
     * @param key 键名
     * @param <K> 泛型类型参数,表示键的类型
     * @return 浮点类型的值。若原始值不是Float类型但可以转成Number,
     *         将通过Number.floatValue()进行转换。
     *         若无法解析或值为null,则返回null。
     */
    public static <K> Float getFloat(final Map<? super K, ?> map, final K key) {
        final Number value = getNumber(map, key);
        if (value == null) {
            return null;
        }
        if (value instanceof Float) {
            return (Float) value;
        }
        return Float.valueOf(value.floatValue());
    }

    /**
     * 获取指定键对应的双精度(Double)值。
     *
     * @param map 包含数据的Map
     * @param key 键名
     * @param <K> 泛型类型参数,表示键的类型
     * @return 双精度类型的值。若原始值不是Double类型但可以转成Number,
     *         将通过Number.doubleValue()进行转换。
     *         若无法解析或值为null,则返回null。
     */
    public static <K> Double getDouble(final Map<? super K, ?> map, final K key) {
        final Number value = getNumber(map, key);
        if (value == null) {
            return null;
        }
        if (value instanceof Double) {
            return (Double) value;
        }
        return Double.valueOf(value.doubleValue());
    }


    // ---------------------- new ----------------------

    /**
     * 创建一个新的HashMap实例。
     *
     * @param <K> 键的泛型类型
     * @param <V> 值的泛型类型
     * @return 新创建的HashMap实例
     */
    public static <K, V> HashMap<K, V> newMap() {
        return new HashMap<K, V>();
    }

    /**
     * 构建一个包含单个键值对的新HashMap。
     *
     * @param k1 第一个键
     * @param v1 第一个值
     * @param <K> 键的泛型类型
     * @param <V> 值的泛型类型
     * @return 包含该键值对的HashMap实例
     */
    public static <K, V> HashMap<K, V> newMap(K k1, V v1) {
        HashMap<K, V> map = new HashMap<>();
        map.put(k1, v1);
        return map;
    }

    /**
     * 构建一个包含两个键值对的新HashMap。
     *
     * @param k1 第一个键
     * @param v1 第一个值
     * @param k2 第二个键
     * @param v2 第二个值
     * @param <K> 键的泛型类型
     * @param <V> 值的泛型类型
     * @return 包含这两个键值对的HashMap实例
     */
    public static <K, V> HashMap<K, V> newMap(K k1, V v1, K k2, V v2) {
        HashMap<K, V> map = new HashMap<>();
        map.put(k1, v1);
        map.put(k2, v2);
        return map;
    }

    /**
     * 构建一个包含三个键值对的新HashMap。
     *
     * @param k1 第一个键
     * @param v1 第一个值
     * @param k2 第二个键
     * @param v2 第二个值
     * @param k3 第三个键
     * @param v3 第三个值
     * @param <K> 键的泛型类型
     * @param <V> 值的泛型类型
     * @return 包含这三个键值对的HashMap实例
     */
    public static <K, V> HashMap<K, V> newMap(K k1, V v1, K k2, V v2, K k3, V v3) {
        HashMap<K, V> map = new HashMap<>();
        map.put(k1, v1);
        map.put(k2, v2);
        map.put(k3, v3);
        return map;
    }

    /**
     * 构建一个包含四个键值对的新HashMap。
     *
     * @param k1 第一个键
     * @param v1 第一个值
     * @param k2 第二个键
     * @param v2 第二个值
     * @param k3 第三个键
     * @param v3 第三个值
     * @param k4 第四个键
     * @param v4 第四个值
     * @param <K> 键的泛型类型
     * @param <V> 值的泛型类型
     * @return 包含这四个键值对的HashMap实例
     */
    public static <K, V> HashMap<K, V> newMap(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4) {
        HashMap<K, V> map = new HashMap<>();
        map.put(k1, v1);
        map.put(k2, v2);
        map.put(k3, v3);
        map.put(k4, v4);
        return map;
    }

    /**
     * 构建一个包含五个键值对的新HashMap。
     *
     * @param k1 第一个键
     * @param v1 第一个值
     * @param k2 第二个键
     * @param v2 第二个值
     * @param k3 第三个键
     * @param v3 第三个值
     * @param k4 第四个键
     * @param v4 第四个值
     * @param k5 第五个键
     * @param v5 第五个值
     * @param <K> 键的泛型类型
     * @param <V> 值的泛型类型
     * @return 包含这五个键值对的HashMap实例
     */
    public static <K, V> HashMap<K, V> newMap(K k1, V v1, K k2, V v2, K k3, V v3, K k4, V v4, K k5, V v5) {
        HashMap<K, V> map = new HashMap<>();
        map.put(k1, v1);
        map.put(k2, v2);
        map.put(k3, v3);
        map.put(k4, v4);
        map.put(k5, v5);
        return map;
    }


    // ---------------------- other ----------------------

}
最后修改:2025 年 11 月 14 日
如果觉得我的文章对你有用,请随意赞赏