当它们具有相同的属性时,如何合并列表中的某些元素?
例如假设我有以下内容:
case class Foo(year: Int, amount: Int)
val list = List(Foo(2015, 10), Foo(2015, 15), Foo(2019, 55))
如何将list
转换为Scala方式的List(Foo(2015, 25), Foo(2019, 55))
?
如您所见,Foo(2015, 10)
和Foo(2015, 15)
都合并到List(Foo(2015, 25)
中。
与Combining elements in the same list类似的问题,但这是C#/ LINQ的问题。
答案 0 :(得分:4)
如果您使用的是Scala 2.13
,请考虑使用groupMapReduce
:
list.groupMapReduce(_.year)(_.amount)(_ + _).
map{ case (y, a) => Foo(y, a) }
// res1: scala.collection.immutable.Iterable[Foo] = List(Foo(2019,55), Foo(2015,25))
答案 1 :(得分:2)
使用groupBy
按list
排列year
,然后映射结果以使其具有适当的形状,并sum
分别{ {1}}。
amount
答案 2 :(得分:0)
只是 Brian 答案的重构。我使用模式匹配正确命名值。
我认为这有助于阅读代码。
list
.groupBy{case Foo(year, _) => year}
.map{ case (year, foos) =>
Foo(year,
foos.map{ case Foo(_, amount) => amount}.sum)
}