2013-05-22 6 views
7

У меня есть коллекция Option[T], и теперь я хочу извлечь из нее значения. Но я также хочу, чтобы новая коллекция исключила None.Convert Seq [Option [T]] to Seq [T]

val foo = List(None, None, Some(1), None, Some(2)) 

Первая мысль пришла мне в голову map, но это немного неинтуитивными.

foo.map(o => o.get) // Exception! 
foo.map(o => o.getOrElse(null)).filterNot(_ == null) // List(1, 2), works but not elegant 

Существует ли более простой способ достичь такого поведения?

+6

flatMap это дерьмо :) –

ответ

22

Используйте flatten метод:

scala> val foo = List(None, None, Some(1), None, Some(2)) 
foo: List[Option[Int]] = List(None, None, Some(1), None, Some(2)) 

scala> foo.flatten 
res0: List[Int] = List(1, 2) 

Просто чтобы быть полным, есть также flatMap метод:

foo.flatMap(x => x) 

и постижение:

scala> for(optX <- foo; x <- optX) yield x 
res1: List[Int] = List(1, 2) 

и собирать (действует как фильтр + карта):

scala> foo.collect { case Some(x) => x } 
res2: List[Int] = List(1, 2) 
Смежные вопросы