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

Tod*_*d M 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")
)
Run Code Online (Sandbox Code Playgroud)

我想传递一个函数到这样的东西:

def getIntegrationOption(ARG) = {
  availableOptions.find(ARG)
}
Run Code Online (Sandbox Code Playgroud)

ARG可能是:

x => x.id == Option(id)
Run Code Online (Sandbox Code Playgroud)

要么

x => x.name == "blah1"
Run Code Online (Sandbox Code Playgroud)

想法?思考?

Dan*_*mon 5

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

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


Tom*_*icz 5

这应该工作:

def getIntegrationOption(predicate: IntegrationOption => Boolean) = 
  availableOptions.find(predicate)
Run Code Online (Sandbox Code Playgroud)

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

getIntegrationOption(_.iconUrl == "dsaadsf.png")
Run Code Online (Sandbox Code Playgroud)

请注意,由于IntegrationOption已经是一个案例类,您可以使用模式匹配和部分应用的函数进行更精细的搜索:

availableOptions.collectFirst{
  case IntegrationOption(Some(1), name, _) => name
}
Run Code Online (Sandbox Code Playgroud)

要么:

availableOptions.collectFirst{
  case io@IntegrationOption(_, "blah2", _) => io
}
Run Code Online (Sandbox Code Playgroud)