我有一个Iterator[Option[T]]
,我希望为那些Iterator[T]
Option
T
的{{1}}获得isDefined
。必须有一个比这更好的方法:
it filter { _ isDefined} map { _ get }
我原以为在一个构造中有可能......有人有什么想法吗?
答案 0 :(得分:14)
如果it
是Iterable
val it:Iterable[Option[T]] = ...
it.flatMap( x => x ) //returns an Iterable[T]
如果it
是Iterator
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 对于大多数人而言都是一个难以理解的名字(实际上,调用它>>=
对我来说更直观)。