它的工作原理一樣嗎?
將生成相同的答案,但不同的代碼將在每種情況下發出,如您所料。
您可以檢查每種情況下生成的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