Java Stream如何从含校名、课程列表的对象构建Map<String,Int>
问题原因
你的代码有两个核心错误:
- 方法引用写法不合法:
University::getCourses.size()不符合Java方法引用的语法规则。方法引用只能直接引用类/实例的已有方法,不能在方法引用后直接链式调用返回对象的其他方法——你想要的「先调用getCourses()拿到课程列表,再调用size()取长度」的逻辑,不能通过这种拼接方法引用的方式实现。 - 泛型类型写错:Java中整数包装类型是
Integer,不存在Int这个引用类型,Map的值类型声明错误也会导致编译失败。
可行解决方案
直接用lambda表达式实现value的映射逻辑即可,写法最简洁可读性最高:
Map<String, Integer> result = universities.stream() .collect(Collectors.toMap( University::getName, // key取大学名称,符合方法引用语法 university -> university.getCourses().size() // value取当前大学的课程列表长度 ));
额外注意
如果你的大学列表中可能存在同名的University实例,上面的写法会抛出IllegalStateException(toMap收集器默认不允许重复key),这种场景可以传入第三个合并函数参数处理重复key的冲突,比如遇到重名时保留第一个的课程数:
Map<String, Integer> result = universities.stream() .collect(Collectors.toMap( University::getName, university -> university.getCourses().size(), (existingCount, newCount) -> existingCount ));
不推荐硬凑方法引用的写法(比如通过Function.andThen组合University::getCourses和List::size),可读性远差于lambda,没有实际使用价值。
内容的提问来源于stack exchange,提问作者tdeus
相关产品推荐
相关产品推荐

