它的工作原理一样吗?
将生成相同的答案,但不同的代码将在每种情况下发出,如您所料。
您可以检查每种情况下生成的IL,如下所示。用下面的内容创建一个 “test.scala
” 文件:
import PartialFunction.cond
trait A; class A1 extends A; class A2 extends A
class Filterer {
def filter1(as: List[A]) =
as.filter(cond(_){case _: A1 => true}) // use pattern matching
def filter2(as: List[A]) =
as.filter(_.isInstanceOf[A1]) // use isInstanceOf
}
然后运行:
scalac test.scala
为了检验IL为as.filter(cond(_){case _: A1 => true})
版本,请
javap -c 'Filterer$$anonfun$filter1$1'
javap -c 'Filterer$$anonfun$filter1$1$$anonfun$apply$1'
然后检查IL对于as.filter(_.isInstanceOf[A1])
版本,您可以做
javap -c 'Filterer$$anonfun$filter2$1'
“cond
”版本使用更多中间值并实例化更多表示所涉及的额外匿名函数的对象。
感谢提醒我关于'collect'? – Michael 2014-08-27 15:14:33
这也适用于匹配Java类型,而不仅仅是Scala类型(从2.11.4开始测试) – 2014-12-16 21:38:10