如何基于整数列表通过Stream生成指定嵌套Map结构?
问题解答
首先纠正你示例代码里的列表初始化错误,Java中不能直接用new ArrayList(){1,2,3};这种方式初始化,正确写法可以是:
List<Integer> ids = new ArrayList<>(Arrays.asList(1, 2, 3)); // Java 9+ 也可以这么写 List<Integer> ids = List.of(1, 2, 3);
回到你的需求:把id列表转成Map<Integer, Map<String, String>>,外层Map的键是id,值为空的Map<String,String>。其实不需要用到Stream.generate(),因为generate()是用来生成无限流的,而我们是基于已有的有限列表做转换,直接用列表本身的stream()配合Collectors.toMap()就能一步完成:
Map<Integer, Map<String, String>> result = ids.stream() .collect(Collectors.toMap( id -> id, // 外层Map的键直接取列表中的id id -> new HashMap<>() // 每个键对应一个空的HashMap ));
如果非要尝试用generate()(完全没必要,属于舍近求远),需要额外用limit()限制流的长度来匹配列表大小,写法会很冗余:
Map<Integer, Map<String, String>> result = Stream.generate(ids::iterator) .limit(ids.size()) .map(Iterator::next) .collect(Collectors.toMap( id -> id, id -> new HashMap<>() ));
显然第一种方案更直观高效,直接基于原列表的流做转换,没有多余操作。
内容的提问来源于stack exchange,提问作者Sam Fisher
相关产品推荐
相关产品推荐

