2009-03-19 16 views
10

私はIterator[Option[T]]を持っていると私はそれらOptionTisDefinedためIterator[T]を取得したいです。これよりも良い方法があるに違いありません:Scalaは

it filter { _ isDefined} map { _ get } 

私はそれが一方の構築物でできたと思っているだろう...誰任意のアイデア?

val it: Iterator[Option[T]] = ... 
val flatIt = it.flatten 

答えて

14

私のために働く(Scala 2.8):

it.collect {case Some(s) => s} 
+0

スケーラユーザメーリングリストからあなたが誰であるかを知っていれば、私は確信しています(現時点ではScala dev envtにアクセスできません:-)。これがどのように機能するか少し説明できますか?私は馬鹿ではないと約束しますが、スカードからこれを取得するはずです。 –

+0

"flatMap {_ elements}"ではないでしょうか? (私は再びscaladocを読んだことがあります!) –

+1

StackOverflowでもっと多くのScalaの達人を見てうれしいです。 scala-userメーリングリストは私の受信トレイを休憩/継続より難解な引数で埋めています: –

10

である場合にはIterable

val it:Iterable[Option[T]] = ... 
it.flatMap(x => x)    //returns an Iterable[T] 

である場合には

+1

さて、そうです。質問が尋ねられ答えられたとき、それはうまくいかなかった。 (あなたが言うことができない場合は、「シンプル」という言葉の使用は、以前の討論者が直接的な答えを見過ごしてしまったことを意味します。) – extempore

+0

@extempore:そうです。私は自分のコメントを修正した。 – soc

5

これ:ititこれは現在可能であるより新しいバージョンでIterator

val it:Iterator[Option[T]] = ... 
it.flatMap(x => x elements)  //returns an Iterator[T] 
it.flatMap(_ elements)    //equivalent 
3

私にとって、これはモナドUIの古典的な使用例です。

for { 
    opt <- iterable 
    t <- opt 
} yield t 

これは、前述したflatMap解決のためだけに砂糖だし、それは同じバイトコードを生成します。しかし、構文は重要ですが、スカラのモナドfor構文を使用する最も良い時期の1つは、特にコレクションと組み合わせてOptionを使用している場合です。

私はこの定式化がかなり読みやすく、特に関数型プログラミングに精通していない人にとってはそうだと思います。私はしばしば、ループのモナディック表現と関数表現の両方を試し、どちらがより単純かを見てみましょう。私はと思うflatMapはgrok(そして実際にはそれを>>=と呼ぶとわかりやすくなります)の大部分の人にとっては難しい名前です。