如何使用Collectors.groupingBy生成值为HashMap的嵌套分组结果
结论
仅通过collect()方法配合嵌套收集器即可实现需求,无需两次遍历集合处理。
实现思路
利用Collectors.groupingBy的下游收集器嵌套能力:
- 外层分组规则不变,按姓名字符串长度作为键
- 下游使用
collectingAndThen收集器:先将同长度的姓名收集为列表,再将列表转换为「数量-姓名列表」结构的内层Map
完整实现代码
import java.util.*; import java.util.stream.Collectors; public class StreamApplicationDemo { public static void main(String[] args) { List<String> names = new ArrayList<>( Arrays.asList("Amir", "Hatef","Mehran", "Mojtaba", "Mohammad", "Ali", "Davood", "Reza", "Mohsen") ); Map<Integer, Map<Integer, List<String>>> result = names.stream() .collect(Collectors.groupingBy( // 外层分组键:姓名长度 String::length, Collectors.collectingAndThen( // 第一步:收集同长度的所有姓名为列表 Collectors.toList(), // 第二步:将列表转为内层Map,键是列表长度(即该长度姓名的数量),值是姓名列表 list -> { Map<Integer, List<String>> innerMap = new HashMap<>(); innerMap.put(list.size(), list); return innerMap; } ) )); System.out.println(result); } }
输出结果
运行后输出和预期结构完全一致:
{3={1=[Ali]}, 4={2=[Amir, Reza]}, 5={1=[Hatef]}, 6={3=[Mehran, Davood, Mohsen]}, 7={1=[Mojtaba]}, 8={1=[Mohammad]}}
内容的提问来源于stack exchange,提问作者NoScript07
相关产品推荐
相关产品推荐

