我是斯卡拉的新手。如何编写此函数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循环中取出。提前致谢。
答案 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)