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.


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)

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


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)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.