2013-02-27 8 views
12

ループとパターンマッチに基づいて異なるケースクラスオブジェクトのリストを作成しています。 デフォルトのケース(本質的にリストをフィルタリングし、1つのステップでタイプにマッピングする)に当たるアイテムを除外(スキップ)したい。パターンマッチの場合にのみ収穫

私はおそらくすべての可能性を見るためにScalaにとって新しすぎです。私の試み:

val events = for (ev <- data) yield { 

     ev.sport match { 
      case "FOOTBALL" => new FootballEvent(ev) 
      case "SOCCER" => new SoccerEvent(ev) 
      case _ => None 
     } 

    } 

私はその後、リストをフィルタリングすることもできますが、私はこれを行うためのいくつかの空想のScalaの方法があります容疑者:)

あなたは、これが最良の行われるべきかのいずれかのアイデアを持っているなら、私に知らせてください。 !

+0

3つ以上ではなく、2つのケースがある場合、これは1つの 'for ... yield'で行うことができます - ここでは例を示します:' for {Some(x)< - Some(None:Option [String])} yield "ここには入るべきではない" ' –

答えて

27

それは歩留まりの構文であるということはありませんが、パターンマッチングを収集し使用することができます。それは、「その他」の場合に失敗し、代わりにちょうど比類のないアイテムをドロップ習慣.foreach良く知られている.mapとは異なり

val events = data.collect { ev => ev.sport match { 
    case "FOOTBALL" => new FootballEvent(ev) 
    case "SOCCER" => new SoccerEvent(ev) 
}} 

と。

+1

あなたが最初に答えたので私はあなたにそれを残すだろうが、どちらも私たちのどちらも最初の試みでそれを正しく得ていない。はい、構文エラーを修正したようです: –

+0

は、b4を収集しなかったことに気づきませんでした。 – javadba

9

for-yieldの標準フィルタはx <- y if f(x,..)で得られます。ここでは、部分関数を使用する例を示します。

val m: PartialFunction[Event, Event] = ev => ev.sport match { 
    case "FOOTBALL" => new FootballEvent(ev) 
    case "SOCCER" => new SoccerEvent(ev) 
}; 

for { ev <- data if m.isDefindAt(ev) 
     val x = m(ev) 
} yield x 

// or, without the temporary binding: 
for (ev <- data if m.isDefindAt(ev)) yield m(ev) 

注この署名def collect[B](pf: PartialFunction[A, B]): CC[B]戻る「が定義されている各要素に与えられた部分関数PFを適用し、回収から生じる新しいコレクションを有し、他の回答に記載さTraversable.collect 、との類似性結果"。初期マップ後

for { ev <- data; 
     x <- ev.sport match { 
     case "FOOTBALL" => Some(new FootballEvent(ev)) 
     case "SOCCER" => Some(new SoccerEvent(ev)) 
     case _ => None 
     } 
} yield x 

このフィルタは、その後なし(すなわち「商品」)を反復処理することにより、または一部(すなわち「1つのアイテム」):ifなし

代替bwrogaの削除答えのバリエーションです。


誰かが「新しい」scaladocに個別のメソッドにリンクする方法を私に伝えることができた場合は、私が最も感謝されると思います。

+1

ありがとう!私はすべてのアプローチを試してみた。 – Joernsn

+0

'scala.collection.Traversable'の現在のscaladocsへのリンクhttp://www.scala-lang.org/api/current/scala/collection/Traversable.html – Davos

関連する問題