отношение один ко многим из карты в Scala - PullRequest
0 голосов
/ 14 марта 2012

Я новичок в скале. Как мне написать эту функцию getFilledOrder (), чтобы она прошла тест assert:

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)
    })

}

Не компилируется, так как функция не возвращает ордер. Как мне получить заполненный заказ из цикла foreach. Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 14 марта 2012

Всякий раз, когда вы имеете дело с неизменными вещами - и, как правило, в Scala foreach - это неправильная вещь.С неизменяемыми данными вы можете использовать их для вывода, но ничего больше.

Возвращает все ордера, содержащиеся на карте.Ваш код предполагает, что карта содержит только один порядок, что означает, что передавать карту вообще глупо.

def getFilledOrder(orderLineMap: Map[Order, LineItem]) = orderLineItemMap.map { 
  case (order, lineItem) => order.copy(lineItem = lineItem) 
}
0 голосов
/ 14 марта 2012

Ваша первоначальная проблема состоит в том, что вам нужно, чтобы ваш блок возвращал 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)
...