我有一个集合Option[T]
,现在我想从中提取值.但我也希望新系列能够排除None
s.
val foo = List(None, None, Some(1), None, Some(2))
Run Code Online (Sandbox Code Playgroud)
我想到的第一个想法是map
,但它有点不直观.
foo.map(o => o.get) // Exception!
foo.map(o => o.getOrElse(null)).filterNot(_ == null) // List(1, 2), works but not elegant
Run Code Online (Sandbox Code Playgroud)
有没有更简单的方法来实现这种行为?
om-*_*nom 24
使用flatten
方法:
scala> val foo = List(None, None, Some(1), None, Some(2))
foo: List[Option[Int]] = List(None, None, Some(1), None, Some(2))
scala> foo.flatten
res0: List[Int] = List(1, 2)
Run Code Online (Sandbox Code Playgroud)
要完成,还有flatMap方法:
foo.flatMap(x => x)
Run Code Online (Sandbox Code Playgroud)
为了理解:
scala> for(optX <- foo; x <- optX) yield x
res1: List[Int] = List(1, 2)
Run Code Online (Sandbox Code Playgroud)
并收集(像过滤器+地图一样):
scala> foo.collect { case Some(x) => x }
res2: List[Int] = List(1, 2)
Run Code Online (Sandbox Code Playgroud)