Я предполагаю, что это продолжение этого вопроса , а matricsData
имеет тип, подобный Map[String, java.lang.Boolean]
?
Проблема в том, что преобразование Predef.Boolean2boolean
из упакованных Java-логических выражений в Scala Booleans возвращает false
, когда его аргумент равен null
, поэтому, если вы хотите различать значения java.lang.Boolean
true, false и null
, вам нужно будет сделать это перед преобразованием(независимо от того, является ли это преобразование явным, как оно есть здесь).
Однако есть гораздо лучшие способы приблизиться к этому, например, следующее:
metricKeys.map { key =>
matricsData.get(key) match {
case Some(value) => if (value) "Y" else "N"
case None => StringUtils.EMPTY
}
}
Или использовать fold
на Option
вместо сопоставления с шаблоном:
metricKeys.map { key =>
matricsData.get(key).fold(StringUtils.EMPTY) { value =>
if (value) "Y" else "N"
}
}
Или сначала преобразуйте значения карты, а затем найдите все ваши ключи:
val asYN: Map[String, String] = matricsData.mapValues { value =>
if (value) "Y" else "N"
}
metricKeys.map(key => asYN.getOrElse(key, StringUtils.EMPTY))
Какой подход вы выберете - дело вкуса, но любой из них лучше, чем использование булевых Java-выражений в штучной упаковке для моделирования каких-либо трехсторонних данных типа «правда или ложь, или отсутствие».