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

Java Stream如何从含校名、课程列表的对象构建Map<String,Int>

问题原因

你的代码有两个核心错误:

  1. 方法引用写法不合法:University::getCourses.size() 不符合Java方法引用的语法规则。方法引用只能直接引用类/实例的已有方法,不能在方法引用后直接链式调用返回对象的其他方法——你想要的「先调用getCourses()拿到课程列表,再调用size()取长度」的逻辑,不能通过这种拼接方法引用的方式实现。
  2. 泛型类型写错: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 06:30:52