阶转动一个Iterator [选项[T]]到一个Iterator [T]
-
21-08-2019 - |
题
我有一个Iterator[Option[T]]
,我想获得这些Iterator[T]
s其中Option
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
这对我的作品(斯卡拉2.8):
it.collect {case Some(s) => s}
要我来说,这是一个典型的使用情况下,用于一元UI。
for {
opt <- iterable
t <- opt
} yield t
这是对于上述flatMap
溶液只是糖,并可以产生相同的字节码。然而,语法的问题,我觉得用Scala的单子for
语法的最好时期之一,是当你与Option
工作,特别是在集合一起。
我认为该制剂是相当多的可读性,特别是对那些不是很熟悉功能的编程。我经常尝试两个循环的一元和功能表现,看看这似乎更直接。我觉得 flatMap 的是为大多数人神交硬名称(实际上,称它>>=
更有直观的感觉对我来说)。
不隶属于 StackOverflow