有几种方法可以将 Map<String, Object> 转换为 Map<String, String>

方法1:使用循环遍历转换(推荐)

Map<String, Object> originalMap = new HashMap<>();
// 假设 originalMap 已经包含了一些数据

Map<String, String> stringMap = new HashMap<>();
for (Map.Entry<String, Object> entry : originalMap.entrySet()) {
    if (entry.getValue() != null) {
        stringMap.put(entry.getKey(), entry.getValue().toString());
    } else {
        stringMap.put(entry.getKey(), null); // 或者使用空字符串 ""
    }
}

方法2:使用 Stream API(Java 8+)

Map<String, String> stringMap = originalMap.entrySet().stream()
    .collect(Collectors.toMap(
        Map.Entry::getKey,
        entry -> entry.getValue() != null ? entry.getValue().toString() : null
    ));

方法3:处理 null 值的 Stream 版本

Map<String, String> stringMap = originalMap.entrySet().stream()
    .filter(entry -> entry.getValue() != null) // 过滤掉 null 值
    .collect(Collectors.toMap(
        Map.Entry::getKey,
        entry -> entry.getValue().toString()
    ));

方法4:使用工具方法

public class MapUtils {
    public static Map<String, String> convertToStringMap(Map<String, Object> originalMap) {
        if (originalMap == null) {
            return new HashMap<>();
        }
        
        Map<String, String> result = new HashMap<>();
        for (Map.Entry<String, Object> entry : originalMap.entrySet()) {
            if (entry.getValue() != null) {
                result.put(entry.getKey(), entry.getValue().toString());
            }
        }
        return result;
    }
}

// 使用
Map<String, String> stringMap = MapUtils.convertToStringMap(originalMap);

方法5:使用第三方库(如 Apache Commons)

如果你使用 Apache Commons Lang:

import org.apache.commons.lang3.StringUtils;

Map<String, String> stringMap = originalMap.entrySet().stream()
    .collect(Collectors.toMap(
        Map.Entry::getKey,
        entry -> StringUtils.defaultString(entry.getValue() != null ? 
                 entry.getValue().toString() : null)
    ));

完整示例

import java.util.*;
import java.util.stream.Collectors;

public class MapConversionExample {
    public static void main(String[] args) {
        // 创建原始 Map
        Map<String, Object> originalMap = new HashMap<>();
        originalMap.put("name", "张三");
        originalMap.put("age", 25);
        originalMap.put("salary", 5000.50);
        originalMap.put("isActive", true);
        originalMap.put("nullValue", null);

        // 方法1:循环遍历
        Map<String, String> method1 = new HashMap<>();
        for (Map.Entry<String, Object> entry : originalMap.entrySet()) {
            if (entry.getValue() != null) {
                method1.put(entry.getKey(), entry.getValue().toString());
            } else {
                method1.put(entry.getKey(), "null");
            }
        }

        // 方法2:Stream API
        Map<String, String> method2 = originalMap.entrySet().stream()
            .collect(Collectors.toMap(
                Map.Entry::getKey,
                entry -> entry.getValue() != null ? entry.getValue().toString() : "null"
            ));

        System.out.println("原始Map: " + originalMap);
        System.out.println("转换后: " + method2);
    }
}

注意事项

  1. null 值处理:根据业务需求决定如何处理 null 值

  2. 性能考虑:对于大数据量,Stream API 可能稍慢于传统循环

  3. 异常处理:如果某些对象的 toString() 方法可能抛出异常,需要适当处理

  4. 线程安全:如果需要在多线程环境下使用,考虑使用 ConcurrentHashMap

推荐使用方法1或方法2,根据你的具体需求和代码风格选择。




Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐