第二次实施有什么问题?
使用:
scala> List(1,2,3).collect{ case i: Int if i % 2 == 0 => i }
res1: List[Int] = List(2)
不
scala> val evens = PartialFunction[Any, Int]{
| case i: Int if i % 2 == 0 => i
| }
evens: PartialFunction[Any,Int] = <function1>
scala> List(1,2,3).collect{evens}
scala.MatchError: 1 (of class java.lang.Integer)
at $anonfun$1.apply(<console>:7)
at $anonfun$1.apply(<console>:7)
at scala.PartialFunction$$anonfun$apply$1.applyOrElse(PartialFunction.scala:242)
at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:33)
at scala.collection.TraversableLike$$anonfun$collect$1.apply(TraversableLike.scala:278)
at scala.collection.immutable.List.foreach(List.scala:318)
...
答案 0 :(得分:6)
您应该像这样创建evens
PartialFunction
:
val evens: PartialFunction[Any, Int] = {
case i: Int if i % 2 == 0 => i
}
使用PartialFunction[Any, Int]{ ... }
,您正在调用对象apply
的{{1}}方法。它定义如下:
PartialFunction
因此def apply[A, B](f: (A) ⇒ B): PartialFunction[A, B]
用作函数,而不是{ case i: Int if i % 2 == 0 => i }
,PartialFunction
在任何参数中定义:
evens
答案 1 :(得分:1)
您的代码实际上适用于Scala 2.9.2(模数不正确的部分函数声明)。但是,无论如何,原因可能是类型签名:
PartialFunction[Any, Int]
由于第一个类型参数是Any
,因此集合元素会自动装箱到java.lang.Integer
个实例 - 它甚至会在堆栈跟踪中这样说(必要时,因为Any
对应Object
1}})。但是,您匹配Int
,这会导致错误。
使用PartialFunction[Int, Int]
可以解决问题,即:
val evens:PartialFunction[Int, Int] = {case i: Int if i % 2 == 0 => i}