试着用函数作为方法的参数来解决问题.一个简单的例子让我们使用:
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)
想法?思考?
您所要做的就是声明一个函数参数,然后您可以像使用任何其他函数一样使用该参数,或将其传递给更高阶的函数,如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)
这应该工作:
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)