scala中地图的一对多关系

时间:2012-03-13 20:15:34

标签: scala scala-collections

我是斯卡拉的新手。如何编写此函数getFilledOrder()以便它通过断言测试:

case class Order(id:String, total:Double, lineItem:Seq[LineItem])
case class LineItem(id:String, productId:String)


val order = Order("1", 10.0, Nil)
val orderLineItemMap = Map(order->List(LineItem("1", "prod1"),LineItem("2", "prod2")))
val filledOrder = getFilledOrder(orderLineItemMap)
assert(filledOrder ==  Order("1", 10.0, List(LineItem("1", "prod1"),LineItem("2", "prod2"))))

我想写这样的东西:

def getFilledOrder(orderLineItemMap : Map[Order, List[LineItem]]):Order = { 
    orderLineItemMap.keys.foreach(order=> { 
      val filledOrder = Order(order.id, order.total, orderLineItemMap.get(order).get)
      println(filledOrder)
    })

}

由于函数未返回订单,因此无法编译。如何将fillOrder从foreach循环中取出。提前致谢。

2 个答案:

答案 0 :(得分:1)

每当你处理不可变的东西时 - 在Scala中,你通常都是,foreach是错误的。使用不可变数据,您可以将其用于输出,但不能用于其他任何内容。

这将返回地图中包含的所有订单。您的代码假定地图只包含一个订单,这意味着传递地图完全是愚蠢的。

def getFilledOrder(orderLineMap: Map[Order, LineItem]) = orderLineItemMap.map { 
  case (order, lineItem) => order.copy(lineItem = lineItem) 
}

答案 1 :(得分:0)

你最初的问题是你需要让你的块返回filledOrder,你可以通过制作最后一个表达式filledOrder,即在调用println之后。

另一个问题是foreach会丢弃其结果。请尝试map

scala> val orderLineItemMap = Map("foo"->"bar", "baz"->"bat")
orderLineItemMap: scala.collection.immutable.Map[java.lang.String,java.lang.String] =    Map(foo -> bar, baz -> bat)

scala> orderLineItemMap.keys.map(order => {
 |   val filledOrder = order.reverse
 |   println(filledOrder)
 |   filledOrder
 | })
oof
zab
res1: Iterable[String] = Set(oof, zab)