Тип коллекции Scala для фильтра

Предположим, у вас есть список (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 ответа

Решение

Scala 2.9:

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

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

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

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

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

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)
Другие вопросы по тегам