过滤器的Scala集合类型

时间:2010-02-07 22:03:30

标签: scala types scala-2.8 scala-collections

假设您有一个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
     | }

3 个答案:

答案 0 :(得分:24)

Scala 2.9:

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

答案 1 :(得分:6)

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

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

(这应该是对Daniel C. Sobral的另外一个很好的答案的评论,但作为一个新用户,我不能发表评论。)

答案 2 :(得分: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)