如何使用Java Stream将静态String Set转换为键为String值为ArrayList的Map
错误原因
你原来的代码存在两个核心问题:
- 语法错误:
Map<String, List<String>定义遗漏了泛型结束的右尖括号> - 逻辑错误:不需要使用
map()中间操作做元素转换,直接在终端的collect()方法中通过Collectors.toMap指定键值生成规则即可
正确实现代码
import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; public class Demo { static Set<String> MY_TYPES = Set.of("type1", "type2", "type3"); public static void main(String[] args) { Map<String, List<String>> myMap = MY_TYPES.stream() .collect(Collectors.toMap( // 用Set中的元素本身作为Map的键 type -> type, // 每个键对应初始化一个新的ArrayList作为值 type -> new ArrayList<>() )); } }
如果偏好更简洁的写法,可以用Function.identity()代替显式的lambda表达式返回元素本身:
// 需要先导入java.util.function.Function Map<String, List<String>> myMap = MY_TYPES.stream() .collect(Collectors.toMap( Function.identity(), type -> new ArrayList<>() ));
说明
由于Set本身天然不存在重复元素,所以不需要额外传入toMap的第三个参数处理键冲突问题,生成的Map完全等价于你给出的Map.of初始化效果,每个键对应的List都是独立的新对象。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

