2012-04-11 17 views
75

Wenn ich eine List[Option[A]] in Scala habe, was ist der idiomatische Weg, die None Werte herauszufiltern?Wie filtere None aus der Liste [Option]?

Eine Möglichkeit ist die folgende verwenden:

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

Gibt es eine „idiomatische“ Art und Weise? Das scheint ziemlich einfach zu sein.

+1

Verwandte behalten möchten: https: // stackoverflow.com/questions/4730842/how-to-transform-scala-collection-of-optionx-to-collection-of-x – dskrvk

Antwort

120

Wenn Sie die Optionen zur gleichen Zeit loswerden wollen, können Sie flatten:

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

Ich würde hinzufügen, dass 'flatMap' verwendet werden kann, um die anderen Listenelemente als' None' zu ​​verarbeiten s, ähnlich wie 'someList.flatten.map', da man oft mit diesen Elementen arbeiten und die Liste nicht nur aus Spaß" abflachen "möchte. – Frank

+0

Ja, ich zögerte, Raph zu fragen, was er mit der gefilterten Liste zu tun gedenke. Aber es gibt auch viele Szenarien, in denen Sie nur flattern wollen. – Nicolas

+0

Manchmal möchte ich den Inhalt der Option-Objekte abrufen, aber manchmal brauche ich sie als Option A. Ich finde mehr und mehr Anwendungen für 'Option [A]' - coole Funktion. – Ralph

10

someList.filter(_.isDefined), wenn Sie den Ergebnistyp als List[Option[A]]

Verwandte Themen