首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么immutable.ParMap.mapValues返回ParMap而不是immutable.ParMap?

为什么immutable.ParMap.mapValues返回ParMap而不是immutable.ParMap?
EN

Stack Overflow用户
提问于 2015-04-25 21:43:03
回答 1查看 127关注 0票数 1

在我的Scala2.11.6应用程序中,我定义了如下所示的immutable.ParMap

代码语言:javascript
复制
  object Foos {
    val foos: immutable.ParMap[String, Foo] = immutable.ParMap(
     ...
    )
  }

稍后,我想使用相同的键创建一个新的immutable.ParMap,所以我使用mapValues

代码语言:javascript
复制
 val fooServices: immutable.ParMap[String, FooService] = Exchanges.exchanges mapValues (_.fooService)

斯卡拉

类型ParMapString、FooService的表达式不符合预期的ParMapString、FooService类型。

作为一种解决办法,我可以使用编译允许的用于理解的方法:

代码语言:javascript
复制
val fooServices: immutable.ParMap[String, FooService] =
    for ((name, ex) <- Foos.foos) yield name -> foo.fooService

但是,如果能够使用专门为这个任务设计的库函数,那就太好了。为什么mapValues不能在这里推断出最具体的类型?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-04-25 22:01:32

这不是推断最具体类型的问题。它实际上是scala.collection.parallel.ParMapLike$$anon$2的一个实例,它是底层映射的视图(创建的映射将所有操作转发给原始映射)。

它可以单独为不可变分支和可变分支创建,但是为了在库中实现更好的代码共享,它只是在ParMapLike中创建了一次。因此返回类型是正确的,因为不可变.mapValues的类型与可变.mapValues的类型相同。

如果您不想要视图(作为代理实现),而是实际重新生成集合,则使用map。也就是说,xs.mapValues(v => f(v))变成xs.map{ case (k,v) => (k, f(v)) },然后生成一个新的不可变的ParMap,并按这样的方式键入。

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

https://stackoverflow.com/questions/29871068

复制
相关文章

相似问题

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