加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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
  }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读