地图的Scala值

set*_*thu 3 scala

新的scala ..我想计算List中所有元素的总和,它是地图的值.

case class Test(shareClass:String, noOfShares:Long){}

val list = new Test("a", 10)::new Test("b",20)::new Test("a",30)::new Test("b", 5)::Nil
Run Code Online (Sandbox Code Playgroud)

我想创建一个
- > 40
b - > 25 的Map

我知道我可以在列表中使用group by,它会给我一个测试值列表,但我不知道如何操作.

谢谢!

Sve*_*cke 7

使用groupBy创建Map值是所有匹配对象的列表的位置:

scala> list.groupBy(_.shareClass)
res0: scala.collection.immutable.Map[String,List[Test]] = Map(b -> List(Test(b,20), Test(b,5)), a -> List(Test(a,10), Test(a,30)))
Run Code Online (Sandbox Code Playgroud)

从那里你可以mapValues用来转换地图的值,首先选择noOfShares属性然后sum这些:

scala> list.groupBy(_.shareClass).mapValues(_.map(_.noOfShares).sum)
res1: scala.collection.immutable.Map[String,Long] = Map(b -> 25, a -> 40)
Run Code Online (Sandbox Code Playgroud)

请注意,mapValues只在原始视图上创建视图Map,这意味着每次访问结果_.map(_.noOfShares).sum都会应用-part (即使将其分配给val之前).要获得Map仅包含结果的平原,您可以调用view.force它:

scala> list.groupBy(_.shareClass).mapValues(_.map(_.noOfShares).sum).view.force
res2: scala.collection.immutable.Map[String,Long] = Map(b -> 25, a -> 40)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`mapValues`创建的`Map`会重新计算每次访问的值:http://stackoverflow.com/questions/14882642/scala-why-mapvalues-produces-a-view-and-is-there-any-stable -备择方案 (2认同)