新的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,它会给我一个测试值列表,但我不知道如何操作.
谢谢!
使用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)