есть ли лучший способ написать код ниже?
val t = map.get('type).getOrElse("");
if (t != "") "prefix" + t;
интересоваться встроенным кодом что-то вроде
val t = map.get('type).getOrElse("").????
есть ли лучший способ написать код ниже?
val t = map.get('type).getOrElse("");
if (t != "") "prefix" + t;
интересоваться встроенным кодом что-то вроде
val t = map.get('type).getOrElse("").????
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("")
Это, вероятно, необязательно, но похоже, что вы не ожидаете наличия пустых строк на карте.
Также стоит отметить, что в некоторых случаях, вы можете заменить несколько общих .getOrElse
использований одним .withDefaultValue
вызова.
val map = complexMapCalculation().withDefaultValue("")
val t = map('type)
Я бы не сказал, что это то, что нужно делать каждый раз, но это может быть удобно.
Вы также можете использовать класс 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 = ""
Читая книгу " 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)