2012-03-13 3 views
0

私はスカラの初心者です。それがアサートテストを通過するようにどのように私はこの機能getFilledOrderを()書きください:スカラーの地図からの1対多の関係

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ループからfilledOrderをどのように取得するのですか。前もって感謝します。

+0

あなたの例は、あなたの機能が一般的に何をしたいのかを知ることが困難である場合を除いて、特にそうです。マップに2つのキーがあるとします。 idと結果の順序の合計はどうなるでしょうか? –

+0

申し訳ありません地図は常に1つの注文オブジェクトキーしか持たないことを明確にすべきでした。 –

答えて

0

あなたの最初の問題は、あなたがあなたのブロックがprintlnを呼び出した後、つまり最後の式filledOrderを作ることによってあなたがfilledOrderを返すにする必要があるということです。

もう1つの問題は、foreachが結果を破棄していることです。 foreachを行うには間違ったことで、Scalaで、あなたが通常であり、 - あなたは不変のものを扱っているときはいつでも

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) 
+0

foreachは、その関数の引数の結果を破棄してunitを返します。それは動作しません。 –

+0

それは動作しません。それでも同じエラー。私はここでforeachを使用すべきではないと思いますか? –

+0

おそらくそうではありません。あなたはforeachの中から帰ることができますが、確かにあなたがすべきことではありません。 –

1

:代わりにmapを試してみてください。不変のデータでは、それを出力に使うことができますが、他には何もありません。

マップに含まれるすべての注文を返します。あなたのコードでは、マップには1つの注文のみが含まれていると仮定しています。つまり、マップをまったく渡すことは愚かです。

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

これは機能しました。どうもありがとうございました。私がしなければならなかった唯一の変更は、新しいメソッドがIterable [Order]を再チューニングしているので、assertメソッドをfilledOrder.headに変更することでした。 –