Scala生成Map时值为函数引用而非执行结果的问题排查与解决
问题分析与解决
错误原因
你写的keys.map((_, getData(_)))里,getData(_)的写法被Scala解析成了函数引用(类型为String => MyDataClass),而非执行getData函数并传入当前key。因为在元组的上下文中,下划线没有绑定到当前遍历的key,而是被当作一个匿名函数的参数占位符,最终每个元组元素变成了(key, getData _),导致生成的Map值是函数本身而非执行结果。
修改后的代码
有几种简洁的修正方式:
方式1:显式传递参数
case class MyDataClass(val1: Int, val2: Boolean) def getData(key: String): MyDataClass = { // Dummy implementation MyDataClass(1, true) } def getDataMapForKeys(keys: Seq[String]): Map[String, MyDataClass] = { keys.map(key => (key, getData(key))).toMap }
方式2:使用for推导式(更直观)
case class MyDataClass(val1: Int, val2: Boolean) def getData(key: String): MyDataClass = { // Dummy implementation MyDataClass(1, true) } def getDataMapForKeys(keys: Seq[String]): Map[String, MyDataClass] = { (for (key <- keys) yield (key, getData(key))).toMap }
方式3:用箭头语法简化元组创建
case class MyDataClass(val1: Int, val2: Boolean) def getData(key: String): MyDataClass = { // Dummy implementation MyDataClass(1, true) } def getDataMapForKeys(keys: Seq[String]): Map[String, MyDataClass] = { keys.map(key => key -> getData(key)).toMap }
以上三种方式都会遍历每个key,主动调用getData(key)获取结果,再将(key, 结果)的元组转换为目标类型的Map。
内容的提问来源于stack exchange,提问作者JoeMjr2
相关产品推荐
相关产品推荐

