大規模なコレクションの場合、マップに折りたたむと、目的のコレクションのみが構築されます。リストの中間の地図を作成することが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)))
@somsnyttは、 "最初のためにリーチ"? Wdym? – Dima
私はどのように 'fold'がここでどんな重要な方法でパフォーマンスに役立つか分かりません。 – Dima
@ som-snytt誰もコレクション全体を複製しているわけではありません。 _that_が大きな問題だと思うならば、最初は "immutable/copy-on-write"パラダイム全体でスカラーを使うべきではありません。私はあなたの 'm +(c.name - > c)'は何をしていると思いますか? – Dima