java中,List<Map<String, String>>转成List,我的代码是:
List<Map> mabtestList = Lists.newArrayList();
mabtestList.addAll(AbTestThreadLocalVariable.getNameStrategy());
AbTestThreadLocalVariable.getNameStrategy()是List<Map<String, String>>。
这样写可以吗,还有其他实现方式吗
代码分析
你的写法是否可行?
可以运行 ,但会有编译警告(unchecked warning),因为涉及泛型的强制转换。
java
List<Map> mabtestList = Lists.newArrayList();
mabtestList.addAll(AbTestThreadLocalVariable.getNameStrategy()); // ⚠️ 编译警告,但能运行
List<Map<String, String>>是List<Map>的子类型(在类型擦除后),所以运行时不会报错,但编译器会提示 unchecked 警告。
其他实现方式
方式一:直接赋值(推荐 ✅)
java
List<Map<String, String>> source = AbTestThreadLocalVariable.getNameStrategy();
List<Map> mabtestList = new ArrayList<>(source);
或者更简洁:
java
List<Map> mabtestList = new ArrayList<>(AbTestThreadLocalVariable.getNameStrategy());
方式二:使用强转(不推荐 ⚠️)
java
List<Map> mabtestList = (List<Map>) (List<?>) AbTestThreadLocalVariable.getNameStrategy();
通过
List<?>作为中间桥梁来消除警告,但这只是"欺骗"编译器,实际上并不安全。
方式三:使用 Stream(显式转换)
java
List<Map> mabtestList = AbTestThreadLocalVariable.getNameStrategy()
.stream()
.map(m -> (Map) m)
.collect(Collectors.toList());
方式四:使用通配符(更规范 ✅)
如果你的 mabtestList 只需要读取,建议直接用通配符,完全类型安全:
java
List<? extends Map<String, String>> mabtestList = AbTestThreadLocalVariable.getNameStrategy();
总结对比
| 方式 | 是否有警告 | 是否类型安全 | 推荐度 |
|---|---|---|---|
addAll 直接添加 |
⚠️ 有警告 | 运行时安全 | 一般 |
new ArrayList<>(source) |
⚠️ 有警告 | 运行时安全 | ✅ 推荐 |
(List<Map>)(List<?>) 强转 |
✅ 无警告 | ❌ 不安全 | 不推荐 |
Stream + map |
✅ 无警告 | ✅ 安全 | ✅ 推荐 |
| 使用通配符 | ✅ 无警告 | ✅ 完全安全 | ✅ 最推荐 |
建议
如果可以的话,最好统一使用 List<Map<String, String>> ,避免使用原始类型 List<Map>,这样既类型安全,又避免了不必要的转换。