Scala - 将函数作为参数的方法

时间:2012-02-15 14:22:37

标签: 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"

想法?思考?

2 个答案:

答案 0 :(得分:5)

您所要做的就是声明一个函数参数,然后您可以像使用任何其他函数一样使用该参数,或将其传递给更高阶函数,如find

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

答案 1 :(得分: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 io@IntegrationOption(_, "blah2", _) => io
}