Scala中将字符串列表折叠为Map[String,Boolean]的报错问题求助
问题根因
- 聚合方法选择错误:Scala 标准库中
fold方法的签名限制了初始值、聚合结果必须和列表元素是同类型/超类型,你要从String元素聚合为Map类型,类型不匹配,编译器会自动推断公共超类型为Object,因此报出Object不存在+、size方法的错误,跨类型聚合应该使用foldLeft方法。 - 初始值格式错误:你传入的
Map[String,Boolean]是类型声明,而非空Map实例,需要改为Map.empty[String, Boolean](更推荐)或者Map[String, Boolean]()。 - 运算优先级问题:
key -> key.size < 8的写法会让编译器优先执行<判断,你需要把key.size < 8用括号包裹,明确它是元组的值部分。
解决方案
方案1:使用foldLeft实现(和你给出的JS reduce逻辑完全对齐)
val mappedObject = objectKeys.foldLeft(Map.empty[String, Boolean])((acc, curr) => acc + (curr -> (curr.size < 8)) )
方案2:更简洁的Scala原生写法
不需要手动折叠,直接转换后转Map即可:
val mappedObject = objectKeys.map(key => key -> (key.size < 8)).toMap
两种写法得到的结果都和预期完全一致:
Map(Name -> true, Place -> true, Animal -> true, Thing -> true)
内容的提问来源于stack exchange,提问作者Shivam Sahil
相关产品推荐
相关产品推荐

