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.


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)

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]]


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)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.