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)