20

假设您有一个 List(1,"1"),它的类型是 List[Any],这当然是正确的和预期的。现在,如果我像这样映射列表

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
     | }
4

3 回答 3

24

Scala 2.9:

scala> List(1, "1") collect {
     |   case x: Int => x
     | }
res0: List[Int] = List(1)
于 2010-02-07T22:14:52.380 回答
6

对于任何偶然发现这个问题的人想知道为什么投票最多的答案对他们不起作用,请注意该partialMap方法collect在 Scala 2.8 的最终版本之前已重命名。试试这个:

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

(这真的应该是对 Daniel C. Sobral 的其他精彩回答的评论,但作为一个新用户,我还不能发表评论。)

于 2011-02-11T21:38:17.577 回答
1

关于您修改后的问题,如果您只是在包含您的 partialFunction 的情况下使用保护,您将得到过滤:

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)
于 2010-02-08T20:03:01.887 回答