Я хотел бы использовать оператор match case
, используя списки. Вот мой пример использования:
val test: String = "test3"
val option: String = getMyOption(test).getOrElse("undefined")
test match {
case `test1` | `test2` => doSomething(test, option, param1)
case `test3` | `test4` | `test5` => doSomethingElse(test, param1, param2)
case `test6` => doMyJob()
case `test7` => doMyJob(param2, param3)
case other =>
throw getUnsupportedTestOperation(other)
}
Я попробовал следующее, но кажется, что функции проверяются перед сопоставлением, потому что я получаю NullPointerException
от функции doSomething(test, option)
(что не предполагалосьдля вызова в случае test3
).
def matchList[T](string: String, cases: => Map[Array[String], T], exception: => Exception): T = {
val matched: Option[T] = cases collectFirst {
case (list, matching) if list.contains(string) => matching
}
if(matched.isDefined) matched.get else throw exception
}
val mapping1: Array[String] = Array("test1", "test2")
val mapping2: Array[String] = Array("test3", "test4", "test5")
val mapping3: Array[String] = Array("test6")
val mapping4: Array[String] = Array("test7")
val option: String = getMyOption(test).getOrElse("undefined")
val testMapping: Map[Array[String], Unit] = Map(
mapping1 -> doSomething(test, option, param1),
mapping2 -> doSomethingElse(test, param1, param2),
mapping3 -> doMyJob(),
mapping4 -> doMyJob(param2, param3)
)
matchList(test, testMapping, getUnsupportedTestOperation(other))
В этом случае я передаю Unit
функции, такие как обратные вызовы, но я также хотел бы использовать другие типы (например: String
, Array[String]
..). Что мне не хватает? Как можно избежать оценки содержания Map
перед сопоставлением? Можно ли использовать списки в операторе match case
? Или есть более простой способ добиться этого? (Я бы хотел избежать использования оператора if
внутри match case
.)