我有一个Iterator[Option[T]],我想获得这些Iterator[T]s其中Option TisDefined。必须有比这更好的方式:

it filter { _ isDefined} map { _ get }

我本来认为它在一个结构是可能的...任何人任何想法?

有帮助吗?

解决方案

在其中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

其他提示

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

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

这对我的作品(斯卡拉2.8):

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

要我来说,这是一个典型的使用情况下,用于一元UI。

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

这是对于上述flatMap溶液只是糖,并可以产生相同的字节码。然而,语法的问题,我觉得用Scala的单子for语法的最好时期之一,是当你与Option工作,特别是在集合一起。

我认为该制剂是相当多的可读性,特别是对那些不是很熟悉功能的编程。我经常尝试两个循环的一元和功能表现,看看这似乎更直接。我觉得 flatMap 的是为大多数人神交硬名称(实际上,称它>>=更有直观的感觉对我来说)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top