15

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

私はおそらく Scala に慣れていないので、すべての可能性を見ることができません。私の試み:

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

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

    }

後でリストをフィルタリングすることもできますが、これを行うための派手な Scala の方法があると思います :)

これをどうするのがベストなのか、ご存知の方がいらっしゃいましたら教えてください!

4

2 に答える 2

30

これはyield構文ではありませんが、パターンマッチングでcollectを使用できます。

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

よく知られているものとは異なり.map.foreach「その他」の場合は失敗せず、代わりに一致しないアイテムをドロップします。

于 2013-02-27T21:07:57.360 に答える
10

の標準フィルターは。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)

他の回答で言及されている1との類似性に注意してください。このシグニチャには、「指定された部分関数pfを、それが定義されている各要素に適用して結果を収集した結果の新しいコレクション」が返されます。Traversable.collectdef collect[B](pf: PartialFunction[A, B]): CC[B]

なしの代替案ifは、bwrogaの削除された回答のバリエーションです。

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

これは、最初のマップの後に、None(つまり、「0アイテム」)またはSome(つまり、「1アイテム」)を繰り返し処理することによってフィルタリングします。


1誰かが「新しい」スカラドックの個々のメソッドにリンクする方法を教えてくれたら、私は最も感謝します。

于 2013-02-27T22:40:42.217 に答える