Ответ 1
Ах, я глуп. Ответ myString.toBoolean
.
В Java вы можете написать Boolean.valueOf(myString)
. Однако в Scala, java.lang.Boolean
скрывается scala.Boolean
, которому не хватает этой функции. Достаточно легко перейти на использование исходной Java-версии логического, но это просто не кажется правильным.
Итак, каково однострочное каноническое решение в Scala для извлечения true
из строки?
Ах, я глуп. Ответ myString.toBoolean
.
Как насчет этого:
import scala.util.Try
Try(myString.toBoolean).getOrElse(false)
Если входная строка не преобразуется в допустимое логическое значение, возвращается false
, а не исключение. Это поведение более похоже на поведение Java Boolean.valueOf(myString)
.
Примечание. Не пишите new Boolean(myString)
в Java - всегда используйте Boolean.valueOf(myString)
. Использование варианта new
без необходимости создает объект Boolean
; использование варианта valueOf
не делает этого.
Проблема с myString.toBoolean
заключается в том, что она генерирует исключение, если myString.toLowerCase
не является точно одним из "true"
или "false"
(даже лишнее пустое пространство в строке вызовет исключение).
Если вы хотите точно такое же поведение, как java.lang.Boolean.valueOf
, используйте его полностью, или импортируйте Boolean под другим именем, например import java.lang.{Boolean=>JBoolean}; JBoolean.valueOf(myString)
. Или напишите свой собственный метод, который обрабатывает ваши собственные конкретные обстоятельства (например, вы можете захотеть "t"
быть true
).
Сегодня я получаю удовольствие от этого, сопоставляя набор значений 1/0 с логическим. Мне пришлось вернуться к Spark 1.4.1, и я, наконец, получил его работу:
Try(if (p(11).toString == "1" || p(11).toString == "true") true else false).getOrElse(false))
где p (11) - поле dataframe
В моей предыдущей версии не было "Try", это работает, другие способы сделать это доступны...