将 List<Map<String, Object>> 转换为 List<String>,通常有两种常见的业务场景。请根据你的实际需求选择:
场景一:提取 Map 中某个特定字段的值(最常用)
比如:列表里是用户信息 Map,你想提取所有的 "userName" 组成一个 List。
1. 使用 Java 8 Stream 流(推荐)
代码简洁,可读性强。
import java.util.*;
import java.util.stream.*;
public class Main {
public static void main(String[] args) {
List<Map<String, Object>> list = new ArrayList<>();
// 假设填充了数据...
// map1: {"id": 1, "name": "Alice"}
// map2: {"id": 2, "name": "Bob"}
String keyName = "name"; // 你要提取的字段名
List<String> resultList = list.stream()
.map(map -> map.get(keyName)) // 1. 获取指定 key 的值 (Object)
.filter(Objects::nonNull) // 2. 过滤掉 null 值 (防止空指针)
.map(Object::toString) // 3. 转换为 String
.collect(Collectors.toList()); // 4. 收集为 List
}
}
2. 使用传统 For 循环
兼容老版本 Java,或者逻辑特别复杂时。
List<String> resultList = new ArrayList<>();
String keyName = "name";
for (Map<String, Object> map : list) {
Object value = map.get(keyName);
if (value != null) {
resultList.add(value.toString());
}
}
场景二:将整个 Map 对象转换为字符串
比如:为了打印日志,想把每个 Map 变成 "{id=1, name=Alice}" 这样的字符串。
List<String> resultList = list.stream()
.map(Map::toString) // 直接调用 Map 的 toString 方法
.collect(Collectors.toList());
⚠️ 注意事项(避坑指南)
-
空指针保护 (NPE):
- Map 中可能不存在该 Key,
map.get(key)会返回null。 - 如果直接调用
null.toString()会报错。 - 解决: 务必加上
.filter(Objects::nonNull)或者在循环中判断if (value != null)。
- Map 中可能不存在该 Key,
-
类型转换:
- Map 里的 Value 是
Object类型,可能是 Integer、Long、Date 等。 - 使用
.map(Object::toString)或String.valueOf(value)可以安全地将大多数对象转为字符串。
- Map 里的 Value 是
-
Java 版本:
- Stream 流方式需要 Java 8 及以上。
- 如果是 Java 7 或更低,只能用 For 循环。
-
性能:
- 如果列表数据量极大(百万级),传统 For 循环性能略优于 Stream,但通常差异可忽略。优先推荐 Stream 以提高代码可读性。
总结
绝大多数情况下,你应该是想要 场景一(提取特定字段) 。记得把代码中的 "name" 替换成你实际需要的 Key 即可。