2012-04-11 2 views
75

Если у меня есть List[Option[A]] в Scala, то какой идиоматический способ отфильтровать значения None?Как фильтровать None из списка [Option]?

Один из способов заключается в использовании следующих:

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

Есть ли более «идиоматическое» путь? Это выглядит довольно просто.

+1

Связанный: https: // stackoverflow.com/questions/4730842/how-to-transform-scala-collection-of-optionx-to-collection-of-x – dskrvk

ответ

120

Если вы хотите избавиться от опций в то же время, вы можете использовать flatten:

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

Я бы добавил, что 'flatMap' может использоваться для обработки элементов списка, отличных от' None' s, аналогично 'someList.flatten.map', так как часто хочется работать с этими элементами, а не просто« сглаживать »список из забавы. – Frank

+0

Да, я не решался спросить Рафа, что он ожидает от отфильтрованного списка. Но есть также много сценариев, где вы просто хотите сгладить. – Nicolas

+0

Иногда я хочу получить содержимое объектов 'Option', но в других случаях мне нужно, чтобы они оставались« Option [A] ». Я все больше и больше использую функцию «Option [A]' - cool. – Ralph

10

someList.filter(_.isDefined) если вы хотите сохранить тип результата, как List[Option[A]]

Смежные вопросы