Scala - методы с функциями в качестве аргументов - PullRequest
1 голос
/ 15 февраля 2012

Пытаюсь разобраться, используя функции в качестве аргументов методов.Для простого примера давайте используем:

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 ]

5 голосов
/ 15 февраля 2012

Это должно сработать:

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
}
5 голосов
/ 15 февраля 2012

Все, что вам нужно сделать, это объявить параметр, который является функцией, затем вы можете использовать параметр как любую другую функцию или передать его в функции более высокого порядка, такие как find:

def getIntegrationOption(f: IntegrationOption => Boolean) = {
  availableOptions.find(f)
}
getIntegrationOptions(x => x.name == "blah1")
//or you could do just
getIntegrationOptions(_.name == "blah1")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...