Scala:将具有相同属性的某些元素合并到列表中

时间:2019-10-23 17:57:14

标签: scala

当它们具有相同的属性时,如何合并列表中的某些元素?

例如假设我有以下内容:

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的问题。

3 个答案:

答案 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)

使用groupBylist排列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)
  }