![](/img/trans.png)
[英]Scala Syntax: Syntactic sugar for converting a Function0 into function1?
[英]Converting Function1 to Map in Scala
我正在尝试编写两个地图并在Scala中获取一个合成的地图。 我正在做以下事情:
val m1=Map(1->'A',2->'C',3->'Z')
val m2=Map('A' -> "Andy", 'Z'->"Zee",'D'->"David")
val m3=m2.compose(m1)
现在m3是m1; m2,但它的类型是Function1。
问题:如何将Function1转换为Map?
PS。 这里 ,建议使用val m3 = m1 andThen m2
,而不是m2.compose(m1)。 无论如何,结果是Function1类型。
你对不存在的密钥有什么看法? 如果你想从地图使用中删除这个值
val m1: Map[Int, Char] = Map(1 -> 'A', 2 -> 'C', 3 -> 'Z')
val m2: Map[Char, String] = Map('A' -> "Andy", 'Z' -> "Zee", 'D' -> "David")
val m3: Map[Int, String] = m1.filter(x => m2.contains(x._2)).map(x => x._1 -> m2(x._2))
//Map(1 -> Andy, 3 -> Zee)
跳过.filter(x => m2.contains(x._2))并抛出此情况的异常
你也可以
val m3: Map[Int, String] = m1.mapValues(m2)
有一点需要注意,尽管返回类型,这将在每次访问m3(x)
时重新计算m2(m1(x))
m3(x)
,就像m2.compose(m1)
。
自从我更新了问题的标题后,答案现在没有直接解决问题主题。 我将等待,看看是否有人可能提供直接答案(即,如何将Function1转换为映射)。
def funToMap[A, B](f: A => B): Map[A, B] = Map.empty[A, B].withDefault(f)
为什么编写两个地图会为您提供一个Function1
Map
提供Function1
的语义,然后提供一些语义。 当你编写两个Map
函数时,你得到一个新的Function1
因为compose
是对函数的一个操作。
所以你不应该期望通过组合两个Map
来获得Map
- 你只是在构建Map
的功能方面,而不是Map
本身。
如何获得一个合成的地图
要将两个Map
实际组合成另一个Map
,可以使用mapValues
,但要小心。 如果你这样做:
val m3 = m1 mapValues m2
你将默默地获得一个视图(参见这个bug ),而不是一个简单的地图,所以当你在m3
进行查找时,它将真正在m1
进行查找,然后在m2
进行查找。 对于大型Map
和少量查找,这是一个胜利,因为你没有处理很多你不需要的条目。 但是如果你进行大量的查找,这可能会导致严重的性能问题。
要真正创建一个代表m1
和m2
组成的新的单个Map
数据结构,您需要执行类似的操作
val m3 = (m1 mapValues m2).view.force
这有点不幸。 在一个完美的世界中, m1 mapValues m2
将为您提供新的单一组合Map
- 并且非常快速地,通过创建一个形状与m1
相同但值通过m2
运行的新数据结构 - 和(m1 mapValues m2).view
将给出你是视图(类型会反映出来)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.