2015-07-05 25 views
0

我正在閱讀Spark書籍中的一個Scala示例。這對我來說看起來很奇怪,至少作爲一個新手。我知道Scala中的標準匹配/案例結構如何在Scala中看起來像。但在這個例子中,我看到'case'正被使用,沒有相應的'match'關鍵字。它甚至有效嗎?或者書中有更多的錯字?'case'關鍵字出現時沒有其對應的'match'關鍵字

val joined = userData.join(events)// RDD of (UserID, (UserInfo, LinkInfo)) pairs 
val offTopicVisits = joined.filter { 
case (userId, (userInfo, linkInfo)) => !userInfo.topics.contains(linkInfo.topic) 
}.count() 

因此,如果它不是一個普通的匹配/案例,是在其他情況下使用的'案件'?

感謝

+0

措辭是略有不同,但問題幾乎相同。另見:[this](http://stackoverflow.com/questions/19478244/how-does-a-case-anonymous-function-really-work-in-scala)或[this](http:// stackoverflow。 COM /問題/ 3730811 /意外性的斯卡拉模式匹配的語法/ 3730879#3730879) –

回答

2

這就是所謂pattern matching anonymous functions在斯卡拉規範,其中前match可以爲同一行爲被丟棄。

{ case p1 => b1 … case pn => bn } 

相當於:

(x1:S1,…,xk:Sk) => (x1,…,xk) match { 
    case p1 => b1 … case pn => bn 
} 

這又相當於:

new scala.Functionk[S1,…,Sk, T] { 
    def apply(x1:S1,…,xk:Sk): T = (x1,…,xk) match { 
    case p1 => b1 … case pn => bn 
    } 
} 

除非預期的類型是一個局部函數:

new scala.PartialFunction[S, T] { 
    def apply(x: S): T = x match { 
    case p1 => b1 … case pn => bn 
    } 
    def isDefinedAt(x: S): Boolean = { 
    case p1 => true … case pn => true 
    case _ => false 
    } 
}