Тип коллекции 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)