首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Scala中将Function1转换为映射

在Scala中将Function1转换为映射
EN

Stack Overflow用户
提问于 2015-06-25 16:05:54
回答 3查看 181关注 0票数 1

我正在尝试编写两个映射,并在Scala中获得一个组合映射。我所做的工作如下:

代码语言:javascript
复制
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。这里,而不是m2.Composed(M1),建议使用val m3 = m1 andThen m2。无论如何,结果是Function1类型。

EN

回答 3

Stack Overflow用户

发布于 2015-06-25 16:25:10

对于不存在的密钥,您会使用什么?如果yuo希望从map中删除此值,请使用

代码语言:javascript
复制
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.include(x._2)),并在这种情况下抛出异常

票数 2
EN

Stack Overflow用户

发布于 2015-06-25 22:08:50

你也可以

代码语言:javascript
复制
val m3: Map[Int, String] = m1.mapValues(m2)

请注意,尽管存在返回类型,但这将在每次访问m3(x)时重新计算m3(x),就像m2.compose(m1)一样。

由于我更新了问题的标题,所以现在的答案并不直接涉及问题的主题。我将拭目以待,看看是否有人可能提供一个直接的答案(即,如何将Function1转换为映射)。

代码语言:javascript
复制
def funToMap[A, B](f: A => B): Map[A, B] = Map.empty[A, B].withDefault(f)
票数 1
EN

Stack Overflow用户

发布于 2015-06-26 01:55:16

为什么编写两个地图会给你一个Function1

Map提供了Function1的语义,然后提供了一些语义。当您组合两个Map函数时,您将得到一个新的Function1,因为compose是对函数的操作。

因此,您不应该期望通过编写两个Map s来获得Map --您只是在合成Map的功能方面,而不是Map本身。

如何获得一个组合地图

要将两个Map实际组合成另一个Map,可以使用mapValues,但要小心。如果你这样做:

代码语言:javascript
复制
val m3 = m1 mapValues m2

您将得到一个视图(请参阅这只虫子),而不是一个简单的映射,因此在m3中进行查找时,它将真正在m1中进行查找,然后在m2中进行查找。对于大型的Map和很少的查找,这是一个胜利,因为你没有处理很多你不需要处理的条目。但是如果您做了大量的查找,这可能会导致严重的性能问题。

要真正创建一个表示m1m2组合的新的单一m1数据结构,您需要执行以下操作

代码语言:javascript
复制
val m3 = (m1 mapValues m2).view.force

这有点不幸。在一个完美的世界中,m1 mapValues m2会给你新的单曲组合Map --而且很快,通过创建一个形状与m1相同但值通过m2运行的新数据结构-- (m1 mapValues m2).view会给您视图(类型将反映这一点)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31055389

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档