繁体   English   中英

在Scala中将Function1转换为Map

[英]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和少量查找,这是一个胜利,因为你没有处理很多你不需要的条目。 但是如果你进行大量的查找,这可能会导致严重的性能问题。

要真正创建一个代表m1m2组成的新的单个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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM