2012-04-11 71 views
75

如果我在Scala中有List[Option[A]],那么过滤出None值的惯用方法是什么?如何过滤没有列表[选项]?

一种方法是使用以下命令:

val someList: List[Option[String]] = List(Some("Hello"), None, Some("Goodbye")) 
someList.filter(_ != None) 

有没有更“地道”的方式?这看起来很简单。

+1

相关someList.filter(_.isDefined) stackoverflow.com/questions/4730842/how-to-transform-scala-collection-of-optionx-to-collection-of-x – dskrvk 2016-04-27 19:53:00

回答

120

如果你想摆脱在同一时间的选项,你可以使用flatten:HTTPS://

scala> someList.flatten 
res0: List[String] = List(Hello, Goodbye) 
+18

我会补充一点,'flatMap'可以用来处理非'None' s,类似于'someList.flatten.map',因为人们经常想要使用这些元素,而不仅仅是将列表变得无趣。 – Frank 2012-04-11 11:38:36

+0

是的,我犹豫了,问Raph他期望如何处理过滤清单。但也有很多情况下你只是想扁平化。 – Nicolas 2012-04-11 12:32:45

+0

有时我想要检索'Option'对象的内容,但有时我需要它们保留为'Option [A]'。我发现越来越多的使用'选项[A]' - 很酷的功能。 – Ralph 2012-04-11 14:23:25

10

,如果你想保留的结果类型为List[Option[A]]