如何用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
相关产品推荐
相关产品推荐

