12

我有一个Iterator[Option[T]],我想Iterator[T]为那些Options where获得一个T isDefined。一定有比这更好的方法:

it filter { _ isDefined} map { _ get }

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

4

4 回答 4

15

如果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
于 2009-03-20T22:11:35.813 回答
11

在较新的版本中,这现在是可能的:

val it: Iterator[Option[T]] = ...
val flatIt = it.flatten
于 2011-02-21T13:15:42.223 回答
5

这对我有用(Scala 2.8):

it.collect {case Some(s) => s}
于 2011-02-24T19:17:29.047 回答
3

对我来说,这是 monadic UI 的经典用例。

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

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

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

于 2011-04-25T14:19:48.107 回答