Я написал ниже для сопоставления с образцом в scala:
scala> val rowMap = Map("abc" -> null)
rowMap: scala.collection.immutable.Map[String,Null] = Map(abc -> null)
scala> val postgresKey = "abc"
postgresKey: String = abc
scala> val h2Key = "xyz"
h2Key: String = xyz
Предлагаемый вариант:
scala> (rowMap.get(postgresKey).map(_.asInstanceOf[String]) , rowMap.get(h2Key).map(_.asInstanceOf[String])) match
| {
| case (Some(value), _) if (value != null && value.trim.nonEmpty) => value
| case (None, Some(value)) if (value != null && value.trim.nonEmpty) => value
| case (_ , _) => "0.0"
| }
res9: String = 0.0
Мой код:
scala> (rowMap.get(postgresKey).map(_.asInstanceOf[String]) , rowMap.get(h2Key).map(_.asInstanceOf[String])) match
| {
| case (Some(value), _) if (value != null ) => if (value.trim.nonEmpty) value else "0.0"
| case (None, Some(value)) if (value != null ) => if (value.trim.nonEmpty) value else "0.0"
| case (_ , _) => "0.0"
| }
res10: String = 0.0
Предлагаемый вариант имеет какие-либо преимущества в производительности, чем мой код. Я знаю, что &&
перестанет сравнивать value.trim.nonEmpty
в тот момент, когда он увидит null
. Итак, мы экономим на 1 сравнении.
Я понимаю, что читать также чище. Что-нибудь еще, что лучше в предлагаемом подходе?
РЕДАКТИРОВАТЬ 1: мне сказали избегать использования null
. Тем не менее, это поступает мне от анорма defaultParser
. Поскольку сценарий сложно воспроизвести, я привел пример выше. В моем случае модульные тесты проводятся во второй половине дня, а фактическая база данных - postgres.
Ниже приведен фрагмент кода:
val anormQuery = SQL(query)
// map the anorm Row as per the input params, differentiate into aggregated and group cols
val tmp = anormQuery.as(anormQuery.defaultParser.*)
logger.info(" Printing the result set object " + tmp.toString())
val finalSqlResultset = tmp.map(row ⇒ {
// Anorm row.asMap has this behaviour that it adds either a leading dot(.) or <tablename>. in front of the map keys (the columns/alias in sql) based on whether it is H2 or Postgres
val rowMap = for ((k, v) ← row.asMap) yield (k, v)
logger.info("Print the resultSet as map : " + rowMap.toString())
val aggregates = expressionsToAggregate.map(input ⇒ {
val (anormKey, postgresKey) = doesColumnHaveAlias.get(input.alias.getOrElse("UnknownAlias")).getOrElse(("Unknown", "Unknown"))
//
val aggResult = AggregatedValue(
input.alias.get,
(rowMap.get(postgresKey).map(_.asInstanceOf[String]), rowMap.get(anormKey).map(_.asInstanceOf[String])) match {
case (Some(value), _) if (value != null && value.trim.nonEmpty) ⇒ value
case (None, Some(value)) if (value != null && value.trim.nonEmpty) ⇒ value
case (_, _) ⇒ "0.0"
})
logger.info("## TRACE 1 ##" + aggResult)
aggResult
})
})