将Java函数转换为Kotlin时Collectors.toMap出现类型不匹配错误如何解决
错误原因
你的代码出现类型不匹配有两个核心诱因:
- 你声明的
creators类型为List<User?>,列表元素可空,但方法引用User::getId的接收者要求是非空的User类型,无法直接作用在可空对象上 - 你在Kotlin中强行沿用Java Stream的API写法,没有使用Kotlin原生集合操作,额外增加了类型适配成本
最优解决方案
直接替换为Kotlin原生集合扩展方法,同时移除不必要的可空标记和非空断言(如果你确认业务中Poll.createdBy、findByIdIn返回的用户、User.id都不会为null),修正后代码如下:
fun getPollCreatorMap(polls: List<Poll>): Map<Long, User> { // 获取投票创建者信息映射 val creatorIds = polls.map(Poll::createdBy).distinct() val creators = userRepository.findByIdIn(creatorIds) // 用Kotlin原生associateBy替代Stream的Collectors.toMap return creators.associateBy(User::id) }
存在空值场景的兼容写法
如果业务中确实可能存在空值,先过滤空值再生成映射即可:
fun getPollCreatorMap(polls: List<Poll>): Map<Long, User> { // 过滤掉创建者ID为空的投票 val creatorIds = polls.mapNotNull { it.createdBy }.distinct() val creators = userRepository.findByIdIn(creatorIds) // 过滤掉查询返回的空用户后生成映射 return creators.filterNotNull().associateBy(User::id) }
原有Stream写法的错误修正(不推荐)
如果你一定要保留Java Stream的写法,手动处理可空对象即可修复报错:
val creatorMap: Map<Long?, User?> = creators!!.stream() .collect(Collectors.toMap( { user: User? -> user?.id }, Function.identity() ))
内容的提问来源于stack exchange,提问作者Nicole Foster
相关产品推荐
相关产品推荐

