У меня есть сценарий, когда мне нужно вызвать до трех служб, чтобы что-то сделать. У каждой службы есть какой-то приоритет, и мой алгоритм зависит от комбинации результатов каждой службы (всех, двух или даже одной). Чтобы справиться с этой ситуацией, я хочу использовать сопоставление с образцом (потому что совпадения и извлечение переменных)
Вот вам упрощенный пример.
case class Foo(bar: String, baz: Option[String])
def expensiveOperation1(): String = ???
def expensiveOperation2(): List[Int] = ???
def expensiveOperation3(): Foo = ???
lazy val r1 = expensiveOperation1()
lazy val r2 = expensiveOperation2()
lazy val r3 = expensiveOperation3()
(r1, r2, r3) match {
case ("Value1", _, _) => "1"
case ("Value2", _, _) => "2"
case (_, List(1), _) => "3"
case (_, Nil, _) => "4"
case ("Value3", 1 :: tail, _) => "5" + tail
case (_, _, Foo("x", Some(x))) => x
case (_, _, _) => "7"
}
Как видите, нет необходимости постоянно вызывать дорогое Operation2 и RoadOperation3, но хотя я сохраняю каждый результат на ленивых значениях, в момент создания Tuple3 вызывается каждый метод.
Я мог бы создать контейнер LazyTuple3 с тремя вызовами параметров по имени, чтобы решить эту проблему, но я получу новую проблему: метод неприменения (LazyTuple3.unapply) возвращает параметр, поэтому после первого «случая» каждый метод будет называется.
Я мог бы решить эту проблему с помощью вложенных «если» или «совпадение», но я хочу дать шанс с одним «совпадением», я считаю это более ясным.
Любая идея?
Заранее спасибо.