scala - 这个 Scala 部分函数是如何工作的?
问题描述
// First using normal dictionary lookup
def findElement(e: String, dict: Map[String, Any]): Option[Any] = dict.get(e)
;
// Second using Partial function
def findElement(e: String, dict: Map[String, Any]): Option[Any] = dict.find { case (k, v) => k == e } map (_._2)
他们都给出了相同的答案,但是,第二个函数是如何工作的?
使用 case 关键字的偏函数的 BigO 是什么?它是否遍历地图的所有元素以找到正确的键?
解决方案
你需要知道的几件事:
Map[A, B]
也是一个PartialFunction[A, B]
- 部分函数有
lift
方法把它变成A => Option[B]
-get
基本上变成apply.lift _
Map
也可以被视为对序列 (Seq[(A, B)]
) - 当你map
,flatMap
,collect
等时你可以看到find
它find
是一个函数,它返回集合的第一个元素(在Map
' 的情况下它是一对) - 如果集合中没有这样的元素,则None
处理它{ case (k,v) => }
使用模式匹配从元组中提取值并将其放入值k
和v
,_._2
是一个元组方法(返回第二个值)。
考虑到这一点:
dict.get(e)
是......很明显 - 键的返回值e
,如果它存在,则将其包装,Some
否则返回None
(apply
将抛出缺失值)。
dict.find { case (k, v) => k == e } map (_._2)
它将尝试找到第一个元素 where k == e
,返回Option[(String, Any)]
,然后通过将整个元组转换为第二个值map
来转换值(如果存在)。Option
推荐阅读
- r - R中的随机森林 - 应用于测试/验证集
- excel - Excel VBA 显示带有 Afterupdate 和 Change 事件的货币
- visual-studio-2019 - 什么取代了 WM_BNCLICKED
- android - 后台服务中的推送通知颤动
- php - 第一条语句执行,但第二条语句不执行
- sql - 在sql中设置记录集的批号
- python - python sqlite为什么将值解释为列
- javascript - 如何在多维数组上使用 FILTER 来检索唯一值?
- nginx - 最新 Docker 映像的服务器名称中的参数数量无效
- html - 如何将多个 a 标签彼此对齐?