2010-02-07 12 views
20

Załóżmy, że masz listę (1, "1"), wpisano List [Any], co jest oczywiście poprawne i oczekiwane. Teraz, jeśli zamapuję taką listę, wynikowy typ to List [Int], który również jest oczekiwany. Moje pytanie brzmi, czy istnieje odpowiednik mapy dla filtra, ponieważ poniższy przykład spowoduje wyświetlenie listy [Any]. czy to możliwe? Zakładam, że można to rozwiązać w czasie kompilacji i prawdopodobnie nie w czasie wykonywania?Typ kolekcji Scala dla filtra

scala> List(1, "1") filter { 
    | case x: Int => true 
    | case _ => false 
    | } 

Odpowiedz

24

Scala 2.9:

scala> List(1, "1") collect { 
    | case x: Int => x 
    | } 
res0: List[Int] = List(1) 
1

W odniesieniu do zmodyfikowanego pytanie, czy po prostu użyć strażnika w przypadku zawierająca swoją funkcja częściowa, masz filtrowanie:

scala> val l1 = List(1, 2, "three", 4, 5, true, 6) 
l1: List[Any] = List(1, 2, three, 4, 5, true, 6) 

scala> l1.partialMap { case i: Int if i % 2 == 0 => i } 
res0: List[Int] = List(2, 4, 6) 
+0

Dlaczego to możliwe tylko ze strażnikiem? –

+0

Przepraszam, to był naprawdę głupi komentarz. Ale dlaczego filter() nie generuje wyniku takiego jak partialMap? –

+1

@ '' '' nie zmienia typu kolekcji, ponieważ nie modyfikuje jej elementów. –

6

Dla każdego natknąłem się na to pytanie, zastanawiając się, dlaczego najbardziej głosowana odpowiedź nie działa dla nich, należy pamiętać, że metoda partialMap została zmieniona na collect przed finałem Scala 2.8 wydanie. Spróbuj to zamiast:

scala> List(1, "1") collect { 
    | case x: Int => x 
    | } 
res0: List[Int] = List(1) 

(. Powinno to być naprawdę komentarz na skądinąd wspaniałego odpowiedzi Daniel C. Sobral, ale jako nowy użytkownik, nie wolno mi jeszcze komentować)