Scala 为什么immutable.ParMap.mapValues返回ParMap而不是immutable.ParMap?
在Scala 2.11.6应用程序中,我定义了一个Scala 为什么immutable.ParMap.mapValues返回ParMap而不是immutable.ParMap?,scala,Scala,在Scala 2.11.6应用程序中,我定义了一个不可变的.ParMap,如下所示: object Foos { val foos: immutable.ParMap[String, Foo] = immutable.ParMap( ... ) } 稍后,我想使用相同的键创建一个新的不可变.ParMap,因此我使用mapValues: val fooServices: immutable.ParMap[String, FooService] = Exchan
不可变的.ParMap
,如下所示:
object Foos {
val foos: immutable.ParMap[String, Foo] = immutable.ParMap(
...
)
}
稍后,我想使用相同的键创建一个新的不可变.ParMap
,因此我使用mapValues
:
val fooServices: immutable.ParMap[String, FooService] = Exchanges.exchanges mapValues (_.fooService)
斯卡拉抱怨道
ParMap[String,FooService]类型的表达式不符合
应为类型ParMap[String,FooService]
作为一种解决方法,我可以使用编译器允许的用于理解的:
val fooServices: immutable.ParMap[String, FooService] =
for ((name, ex) <- Foos.foos) yield name -> foo.fooService
val fooServices:immutable.ParMap[String,FooService]=
对于((名称,例如)foo.fooService
但是,如果能够使用专门为此任务设计的库函数,那就太好了。为什么
mapValues
不能在这里推断出最具体的类型?这不是推断最具体的类型的问题。它实际上是scala.collection.parallel.ParMapLike$$anon$2
的一个实例,这是一个视图ng映射(创建的映射将所有操作转发给原始映射)
它可以分别为不可变和可变分支创建,但为了在库中更好地共享代码,它只在ParMapLike
中创建了一次。因此返回类型是正确的,因为不可变.mapValues
的类型与可变.mapValues
的类型相同
如果您不希望视图(实现为代理)而是实际重新生成集合,请改用
map
。即xs.mapValues(v=>f(v))
变成xs.map{case(k,v)=>(k,f(v))}
然后将生成一个新的不可变的ParMap
。Ahh,这现在非常合理。我没有意识到mapValues
实际上返回了一个视图。这有点混乱,因为与其他集合(例如Seq
)您需要显式调用.view
。@user1885198-mapValues
总是返回一个视图,并行或不并行。它这样做有点令人惊讶,但它是一致的。也许它应该被称为valueView
。在Seq
中没有“每个条目的映射部分”方法,因此它不是真正的可比性。