2016-03-26 4 views
0

私は次のユースケースを持っています。同じコレクションで複数回反復しています。コレクションを繰り返し処理し、1ではなく複数の値を見つけるより良い方法

class Foo(policyToData: Map[String, MyClass]){ 
    val milk: Option[MyClass] = policyToData.values.find(_.`type` == Milk) 
    val meat: Option[MyClass] = policyToData.values.find(_.`type` == Meat) 
    val bread: Option[MyClass] = policyToData.values.find(_.`type` == Bread) 
    val other: List[MyClass] = policyToData.values.filter(_.`type` == Other).toList 
} 

良い方法がありますか? 1回の反復で?

答えて

1

大規模なコレクションの場合、マップに折りたたむと、目的のコレクションのみが構築されます。リストの中間の地図を作成することがOKであれば、誰かがそれは余分な作業を行うことをコメントし、実際に、それは簡単な表現だから

scala> case class C(name: String) 
defined class C 

scala> val cs = List(C("milk"),C("eggs"),C("meat")) 
cs: List[C] = List(C(milk), C(eggs), C(meat)) 

scala> cs.foldLeft(Map.empty[String,C]) { 
    | case (m, c @ C("milk" | "meat")) if !m.contains(c.name) => m + (c.name -> c) 
    | case (m, _) => m } 
res5: scala.collection.immutable.Map[String,C] = Map(milk -> C(milk), meat -> C(meat)) 

その後、

scala> val milk = res5("milk") 
milk: C = C(milk) 

scala> val bread = res5.get("bread") 
bread: Option[C] = None 

groupBy溶液が削除されました。

scala> cs.groupBy(_.name) 
res0: scala.collection.immutable.Map[String,List[C]] = Map(meat -> List(C(meat)), eggs -> List(C(eggs)), milk -> List(C(milk))) 

scala> res0.get("milk").map(_.head) 
res1: Option[C] = Some(C(milk)) 

scala> res0.get("bread").map(_.head) 
res2: Option[C] = None 

または

scala> cs.filter { case C("milk" | "meat") => true case _ => false }.groupBy(_.name) 
res4: scala.collection.immutable.Map[String,List[C]] = Map(meat -> List(C(meat)), milk -> List(C(milk))) 
0

groupByはそれを行います。

val byType = list.groupBy(_.type).withDefaultValue(Nil) 
    val milk = byType(Milk).headOption 
    val other = byType(Other) 

等...

+0

@somsnyttは、 "最初のためにリーチ"? Wdym? – Dima

+0

私はどのように 'fold'がここでどんな重要な方法でパフォーマンスに役立つか分かりません。 – Dima

+0

@ som-snytt誰もコレクション全体を複製しているわけではありません。 _that_が大きな問題だと思うならば、最初は "immutable/copy-on-write"パラダイム全体でスカラーを使うべきではありません。私はあなたの 'm +(c.name - > c)'は何をしていると思いますか? – Dima

関連する問題