如何在scala Map上使用map / flatMap?

时间:2017-11-23 14:38:59

标签: scala dictionary tuples sequence flatmap

我有两个序列,即prices: Seq[Price]overrides: Seq[Override]。我需要对它们做一些魔术,但仅针对基于共享id的子集。

所以我将它们分别分为MapgroupBy

我通过以下方式进行小组讨论:

val pricesById = prices.groupBy(_.someId) // Int => Seq[Cruise]
val overridesById = overrides.groupBy(_.someId) // // Int => Seq[Override]

我希望能够通过flatMap创建我想要的序列:

val applyOverrides = (someId: Int, prices: Seq[Price]): Seq[Price]  => {
  val applicableOverrides =  overridesById.getOrElse(someId, Seq())
  magicMethod(prices, applicableOverrides) // returns Seq[Price]
}

val myPrices: Seq[Price] = pricesById.flatMap(applyOverrides)

我希望myPrices只包含一个大Seq[Price]

然而,我在flatMap方法中使用NonInferedB得到一个奇怪的类型不匹配我无法解决。

1 个答案:

答案 0 :(得分:0)

在scala中,地图是元组,而不是键值对。

flatMap的函数因此只需要一个参数,即元组(key, value),而不是两个参数key, value

由于您可以通过_1访问元组的第一个元素,第二个通过_2等等,您可以生成所需的函数,如下所示:

val pricesWithMagicApplied = pricesById.flatMap(tuple => 
  applyOverrides(tuple._1, tuple._2)

另一种方法是使用大小写匹配:

val pricesWithMagicApplied: Seq[CruisePrice] = pricesById.flatMap {
  case (someId, prices) => applyOverrides(someId, prices)
}.toSeq