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

如何用Java 8 Streams将Map<String, List<Something>>转换为Map<String, Integer>?

解决Java 8 Stream转换Map的报错问题

嘿,我一眼就发现你代码里的问题啦!你写的p->getValue().size()里漏掉了调用对象p,getValue()是Map.Entry的方法,必须通过entry实例来调用才行。

修正后的代码

Map<String, List<Something>> map1 = ...;
Map<String, Integer> map2 = map1.entrySet()
    .stream()
    .collect(Collectors.toMap(
        Map.Entry::getKey,  // 用方法引用替代lambda,代码更简洁
        entry -> entry.getValue().size()
    ));

错误原因解释

原代码里的p->getValue().size()相当于在lambda里直接调用了一个没有上下文的getValue()方法,编译器找不到这个方法的归属,自然会报错。加上p.(或者换成更清晰的变量名比如entry),明确是调用当前entry的getValue()方法,问题就解决了。

额外补充:处理List为null的情况

如果原Map里某些键对应的List<Something>可能是null,直接调用size()会抛出NullPointerException,这时候可以加个空值判断:

Map<String, Integer> map2 = map1.entrySet()
    .stream()
    .collect(Collectors.toMap(
        Map.Entry::getKey,
        entry -> entry.getValue() != null ? entry.getValue().size() : 0
    ));

内容的提问来源于stack exchange,提问作者Nfff3

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:25:46