我有一个Iterator[Option[T]]
,我想Iterator[T]
为那些Option
s where获得一个T
isDefined
。一定有比这更好的方法:
it filter { _ isDefined} map { _ get }
我原以为在一个构造中是可能的……有人有什么想法吗?
我有一个Iterator[Option[T]]
,我想Iterator[T]
为那些Option
s where获得一个T
isDefined
。一定有比这更好的方法:
it filter { _ isDefined} map { _ get }
我原以为在一个构造中是可能的……有人有什么想法吗?
如果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
在较新的版本中,这现在是可能的:
val it: Iterator[Option[T]] = ...
val flatIt = it.flatten
这对我有用(Scala 2.8):
it.collect {case Some(s) => s}
对我来说,这是 monadic UI 的经典用例。
for {
opt <- iterable
t <- opt
} yield t
它只是上述flatMap
解决方案的糖,它产生相同的字节码。但是,语法很重要,我认为使用 Scala 的一元for
语法的最佳时机之一是在使用 . 时Option
,尤其是与集合一起使用时。
我认为这个公式更具可读性,特别是对于那些不太熟悉函数式编程的人。我经常尝试循环的一元表达式和函数表达式,看看哪个看起来更直接。我认为flatMap对于大多数人来说是一个很难理解的名字(实际上,称呼它对>>=
我来说更直观)。