2013-01-17 15 views

Odpowiedz

25

Zauważ, że

list.flatten 

zrobi tak samo dobrze.

6

Tak, można użyć collect za to:

list.collect { case Some(x) => x } 

collect zajmuje PartialFunction[A,B] i zastosowanie tej funkcji do wszystkich elementów, na których jest ona definiowana i odrzuca resztę.

edit:

Jak gpampara poprawnie wspomniano, w tym przypadku flatten będzie wystarczająca. collect byłby właściwym narzędziem, gdyby istniały dodatkowe ograniczenia i/lub transformacje.

+0

Dzięki. Możesz polegać na Scali, że zawsze jest bardziej elegancki sposób ;-) – deamon

+2

Jeszcze bardziej elegancki sposób to po prostu: 'list.flatten' – gpampara

+0

@gpampara Dzięki, udowodnisz mi, że mam rację :-) – deamon

4

Można również użyć:

list.flatMap(x => x) 

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

scala> a.flatMap(x => x) 
res0: List[Int] = List(1, 2) 

Dla wyjaśnienia jak/dlaczego to działa, można sprawdzić ten artykuł: http://www.brunton-spall.co.uk/post/2011/12/02/map-map-and-flatmap-in-scala/

+0

Tak, to działa. Ale nie rozumiem, dlaczego. Zgodnie z dokumentami 'flatMap' musi zwrócić' Option'. – deamon

+1

http://www.brunton-spall.co.uk/post/2011/12/02/map-map-and-flatmap-in-scala/ tu jest dobre wytłumaczenie – Arg

+0

Mój błąd polegał na spojrzeniu na 'flatMap' na klasa "Option", ale oczywiście musiałem spojrzeć na 'List.flatMap'. – deamon

Powiązane problemy