scala лучший синтаксис для карты getOrElse
есть ли лучший способ написать код ниже?
val t = map.get('type).getOrElse("");
if (t != "") "prefix" + t;
интересоваться встроенным кодом что-то вроде
val t = map.get('type).getOrElse("").????
Ответы
Ответ 1
Map
есть свой метод getOrElse
, поэтому вы можете просто написать следующее:
val t = map.getOrElse('type, "")
Который выполняет то же самое, что и определение t
в вашем первом примере.
Чтобы ответить на ваш комментарий: если вы знаете, что ваша карта никогда не будет содержать пустую строку в качестве значения, вы можете использовать следующее, чтобы добавить "prefix"
:
map.get('type).map("prefix" + _).getOrElse("")
Или, если вы используете Scala 2.10:
map.get('type).fold("")("prefix" + _)
Если ваша карта может иметь значения ""
, эта версия будет вести себя немного иначе, чем ваша, так как она добавит префикс к этим значениям. Если вы хотите точно такое же поведение, как ваша версия в однострочном, вы можете написать следующее:
map.get('type).filter(_.nonEmpty).map("prefix" + _).getOrElse("")
Это, вероятно, необязательно, но похоже, что вы не ожидаете наличия пустых строк на карте.
Ответ 2
Также стоит отметить, что в некоторых случаях, вы можете заменить несколько общих .getOrElse
использований одним .withDefaultValue
вызова.
val map = complexMapCalculation().withDefaultValue("")
val t = map('type)
Я бы не сказал, что это то, что нужно делать каждый раз, но это может быть удобно.
Ответ 3
Вы также можете использовать класс Scalaz Zero, чтобы ваш код выглядел ниже. Унарный оператор определен на OptionW.
val t = ~map.get('type) // no prefix
val t = ~map.get('type).map("prefix"+_) // prefix
Вот пример сеанса:
scala> import scalaz._; import Scalaz._
import scalaz._
import Scalaz._
scala> val map = Map('type -> "foo")
map: scala.collection.immutable.Map[Symbol,java.lang.String] = Map('type -> foo)
scala> ~map.get('type)
res3: java.lang.String = foo
scala> ~map.get('notype)
res4: java.lang.String = ""
scala> ~map.get('type).map("prefix"+_)
res5: java.lang.String = prefixfoo
scala> ~map.get('notype).map("prefix"+_)
res6: java.lang.String = ""
Ответ 4
Читая книгу " Play for Scala
, я взял этот фрагмент кода, который был определен в контроллере, что может быть лучшим синтаксисом для getOrElse.
def show(ean: Long) = Action { implicit request =>
Product.findByEan(ean).map { product =>
Ok(views.html.products.details(product))
}.getOrElse(NotFound)
}
В которой Product.findByEan(ean: Long) был определен как
def findByEan(ean: Long) = products.find(_ean == ean)