Wie filtere ich keine aus der Liste [Option]?

105

Wenn ich eine List[Option[A]]in Scala habe, wie kann ich die NoneWerte idiomatisch herausfiltern ?

Eine Möglichkeit besteht darin, Folgendes zu verwenden:

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

Gibt es einen "idiomatischeren" Weg? Das scheint ziemlich einfach zu sein.

Ralph
quelle
1
Siehe auch
dskrvk

Antworten:

161

Wenn Sie die Optionen gleichzeitig entfernen möchten, können Sie Folgendes verwenden flatten:

scala> someList.flatten
res0: List[String] = List(Hello, Goodbye)
Nicolas
quelle
23
Ich würde hinzufügen, dass flatMapverwendet werden kann, um die Listenelemente außer Nones zu verarbeiten, ähnlich wie someList.flatten.map, da man oft mit diesen Elementen arbeiten möchte und nicht nur flattendie Liste aus Spaß.
Frank
Ja, ich habe gezögert, Raph zu fragen, was er mit der gefilterten Liste erwartet. Es gibt aber auch viele Szenarien, in denen Sie nur abflachen möchten.
Nicolas
Manchmal möchte ich den Inhalt der OptionObjekte abrufen , aber manchmal muss er so bleiben Option[A]. Ich finde immer mehr Anwendungen für Option[A]- coole Funktion.
Ralph
Gibt es eine äquivalente Methode vom Typ flatForeach?
CDMckay
1
Wenn Ihre Sammlung unveränderlich ist, wird Faltmap den Trick tun. Wenn Ihre Sammlung veränderlich ist, gibt es keine.
Nicolas
18

someList.filter(_.isDefined) Wenn Sie den Ergebnistyp als beibehalten möchten List[Option[A]]

Kevin O'Riordan
quelle
2

Die catsBibliothek hat auch flattenOption, was jede F[Option[A]]in eine F[A](wo F[_]ist eine FunctorFilter) verwandelt

import cats.implicits._

List(Some(1), Some(2), None).flattenOption == List(1, 2)
dcastro
quelle