2012-02-15 91 views
1

試圖讓我的頭部使用函數作爲方法的參數。舉個簡單的例子,讓我們使用:Scala - 函數作爲參數的方法

case class IntegrationOption(id: Option[Long], name: String, iconUrl: String) 

val availableOptions = List(
    IntegrationOption(Some(1), "blah1", "dsaadsf.png"), 
    IntegrationOption(Some(2), "blah2", "dsaadsf.png") 
) 

我想在一個函數傳遞到這樣的事情:

def getIntegrationOption(ARG) = { 
    availableOptions.find(ARG) 
} 

其中ARG可能是:

x => x.id == Option(id) 

x => x.name == "blah1" 

想法?思考?

回答

5

這應該工作:

def getIntegrationOption(predicate: IntegrationOption => Boolean) = 
    availableOptions.find(predicate) 

現在,您可以按如下方式使用它:

getIntegrationOption(_.iconUrl == "dsaadsf.png") 

請注意,由於IntegrationOption已經是一個案例類,你可以做一些票友與模式匹配和部分應用功能搜索:

availableOptions.collectFirst{ 
    case IntegrationOption(Some(1), name, _) => name 
} 

或:

availableOptions.collectFirst{ 
    case [email protected](_, "blah2", _) => io 
} 
5

所有你需要做的就是聲明一個參數,這是一個功能,那麼你可以使用參數像任何其他功能或將它傳遞給高階功能,如find

def getIntegrationOption(f: IntegrationOption => Boolean) = { 
    availableOptions.find(f) 
} 
getIntegrationOptions(x => x.name == "blah1") 
//or you could do just 
getIntegrationOptions(_.name == "blah1") 
+0

這是偉大的答案了。我可以設置兩個正確答案嗎? – 2012-02-15 15:01:24