Como filtrar Nenhum da Lista [Opção]?

105

Se eu tiver um List[Option[A]]no Scala, qual é a maneira idiomática de filtrar os Nonevalores?

Uma maneira é usar o seguinte:

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

Existe uma maneira mais "idiomática"? Isso parece muito simples.

Ralph
fonte

Respostas:

161

Se você quiser se livrar das opções ao mesmo tempo, pode usar flatten:

scala> someList.flatten
res0: List[String] = List(Hello, Goodbye)
Nicolas
fonte
23
Eu acrescentaria que flatMappode ser usado para processar os elementos da lista diferentes de Nones, semelhante a someList.flatten.map, já que muitas vezes se deseja trabalhar com esses elementos e não apenas com flattena lista por diversão.
Frank
Sim, hesitei em perguntar a Raph o que ele espera fazer com a lista filtrada. Mas também existem muitos cenários em que você deseja apenas nivelar.
Nicolas
Às vezes, quero recuperar o conteúdo dos Optionobjetos, mas outras vezes preciso que eles permaneçam como Option[A]. Estou descobrindo mais e mais usos para Option[A]- recurso legal.
Ralph
Existe um método do tipo flatForeach equivalente?
cdmckay
1
Se sua coleção for imutável, o faltmap resolverá o problema. Se sua coleção é mutável, não, não há.
Nicolas
18

someList.filter(_.isDefined) se você quiser manter o tipo de resultado como List[Option[A]]

Kevin O'Riordan
fonte
2

A catsbiblioteca também tem flattenOption, o que transforma qualquer F[Option[A]]um em F[A](onde F[_]é um FunctorFilter)

import cats.implicits._

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