You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Collectors.groupingBy生成值为HashMap的嵌套分组结果

结论

仅通过collect()方法配合嵌套收集器即可实现需求,无需两次遍历集合处理。

实现思路

利用Collectors.groupingBy的下游收集器嵌套能力:

  1. 外层分组规则不变,按姓名字符串长度作为键
  2. 下游使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 18:30:04