Scala – reduce / foldLeft
发布时间:2020-12-16 18:24:43 所属栏目:安全 来源:网络整理
导读:我有一个嵌套的地图m,如: m =地图(“电子邮件” – “a@b.com”,“背景” – 地图(“语言” – “英语”)) 我有一个数组arr = Array(“background”,“language”) 如何foldLeft / reduce数组并从地图中找到字符串“english”.我试过这个: arr.foldLeft(m)
我有一个嵌套的地图m,如:
m =地图(“电子邮件” – >“a@b.com”,“背景” – >地图(“语言” – >“英语”)) 我有一个数组arr = Array(“background”,“language”) 如何foldLeft / reduce数组并从地图中找到字符串“english”.我试过这个: arr.foldLeft(m){(acc,x)=> acc.get(x)} 但我得到这个错误: <console>:10: error: type mismatch; found : Option[java.lang.Object] required: scala.collection.immutable.Map[java.lang.String,java.lang.Object] arr.foldLeft(m) { (acc,x) => acc.get(x) } 解决方法
你应该注意类型.在这里,你从m开始:Map [String,Any]作为你的acc.你结合一个字符串x并调用get,它返回一个Option [Object].要继续,您必须检查是否有值,检查此值是否为Map,强制转换(由于类型擦除而未选中,因此很危险).
我认为错误在于你的结构类型Map [String,Any]代表你所拥有的东西相当糟糕. 假设你做了 sealed trait Tree case class Node(items: Map[String,Tree]) extends Tree case class Leaf(s: String) extends Tree 您可以添加一些帮助程序来轻松声明树 object Tree { implicit def fromString(s: String) = Leaf(s) implicit def fromNamedString(nameAndValue: (String,String)) = (nameAndValue._1,Leaf(nameAndValue._2)) } object Node { def apply(items: (String,Tree)*) : Node = Node(Map(items: _*)) } 然后声明树就像第一个版本一样简单,但类型更精确 m = Node("email" -> "a@b.com","background" -> Node("language" -> "english")) 然后,您可以添加方法,例如在特征树中 def get(path: String*) : Option[Tree] = { if (path.isEmpty) Some(this) else this match { case Leaf(_) => None case Node(map) => map.get(path.head).flatMap(_.get(path.tail: _*)) } } def getLeaf(path: String*): Option[String] = get(path: _*).collect{case Leaf(s) =>s} 或者如果你愿意用折叠来做 def get(path: String*) = path.foldLeft[Option[Tree]](Some(this)) { case (Some(Node(map)),p) => map.get(p) case _ => None } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- angularjs – 如何在路线上重置滚动位置?
- angular – 如何在Observable.forkJoin(…)中捕获错误?
- linux用shell脚本直接进入python virtualenv环境
- 开源免费天气预报接口API以及全国所有地区代码!!(国家气
- angular – 如何使用RxJs处理/排队多个相同的http请求?
- 第八章 内部字段分隔符IFS、脚本调试DEBUG
- 如何在angular2 webpack中使用jquery?获得$not defined
- 如何在使用scala读取文件后删除hdfs目录中的文件
- macos – BASH:拆分MAC地址 – > 000E0C7F6676到00:0E:0
- bash – Docker Ubuntu图像缺少提示,颜色和完成?