Тип коллекции Scala для фильтра - PullRequest
20 голосов
/ 08 февраля 2010

Предположим, у вас есть список (1, «1»), это типизированный список [любой], что, конечно, правильно и ожидаемо.Теперь, если я сопоставлю список следующим образом:

scala> List(1, "1") map {
     |   case x: Int => x
     |   case y: String => y.toInt
     | }

, получится тип List [Int], который также ожидается.У меня вопрос, есть ли эквивалент для сопоставления для фильтра, потому что следующий пример приведет к List [Any].Это возможно?Я предполагаю, что это может быть решено во время компиляции и, возможно, не во время выполнения?

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

Ответы [ 3 ]

24 голосов
/ 08 февраля 2010

Scala 2.9:

scala> List(1, "1") collect {
     |   case x: Int => x
     | }
res0: List[Int] = List(1)
6 голосов
/ 12 февраля 2011

Любой, кто сталкивается с этим вопросом и интересуется, почему ответ с наибольшим количеством голосов не работает для них, следует помнить, что метод partialMap был переименован в collect до окончательного выпуска Scala 2.8. Попробуйте вместо этого:

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

(Это действительно должен быть комментарий к иначе замечательному ответу Даниэля С. Собрала, но я как новый пользователь пока не могу комментировать.)

1 голос
/ 08 февраля 2010

Что касается вашего измененного вопроса, если вы просто используете защиту в случае, включающем вашу частичную функцию, вы получаете фильтрацию:

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)
...