scala将迭代器[选项[T]]转换为迭代器[T]

时间:2009-03-19 23:51:52

标签: scala scala-collections

我有一个Iterator[Option[T]],我希望为那些Iterator[T] Option T的{​​{1}}获得isDefined。必须有一个比这更好的方法:

it filter { _ isDefined} map { _ get }

我原以为在一个构造中有可能......有人有什么想法吗?

4 个答案:

答案 0 :(得分:14)

如果itIterable

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

如果itIterator

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

答案 1 :(得分:11)

在较新的版本中,现在可以:

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

答案 2 :(得分:5)

这对我有用(Scala 2.8):

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

答案 3 :(得分:3)

对我而言,这是monadic UI的经典用例。

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

它只是上述flatMap解决方案的糖,它产生相同的字节码。但是,语法很重要,我认为使用Scala的monadic for语法的最佳时机之一就是当你使用Option时,特别是与集合一起使用时。

我认为这个公式更具可读性,特别是对那些不熟悉函数式编程的人。我经常尝试循环的monadic和函数表达式,看看哪个看起来更直接。我认为 flatMap 对于大多数人而言都是一个难以理解的名字(实际上,调用它>>=对我来说更直观)。

相关问题