Scala: элегантное преобразование строки в логическое значение

84

На Java можно писать Boolean.valueOf(myString). Однако в Scala java.lang.Booleanскрыто, в scala.Booleanкотором отсутствует эта функция. Достаточно легко переключиться на использование исходной версии логического значения Java, но это кажется неправильным.

Так что же представляет собой однострочное каноническое решение в Scala для извлечения trueиз строки?

Дэвид Кроушоу
источник
Почему бы просто не использовать регулярное выражение?
Кевин Мередит
3
Это совсем не просто.
Jaime

Ответы:

144

Ах, я глупый. Ответ есть myString.toBoolean.

Дэвид Кроушоу
источник
9
Если myString имеет значение null, ваш код выдаст исключение, я предпочитаю подход со следующим ответом Try (myString.toBoolean) .getOrElse (false)
Карлос Вердес
2
Try(myString.toBoolean).getOrElse(false)выполнит работу по выбрасыванию и перехвату исключения. Option(myString).exists(_.toBoolean)позволяет избежать дополнительных усилий.
сфосдал 08
1
Использование Try(myString.toBoolean).getOrElse(false)хорошо. Чисто обрабатывает неподходящую строку.
NKM
110

Как насчет этого:

import scala.util.Try

Try(myString.toBoolean).getOrElse(false)

Если входная строка не преобразуется в допустимое логическое значение false, возвращается вместо создания исключения. Это поведение более похоже на поведение Java Boolean.valueOf(myString).

user24601
источник
Я думаю, что вам нужно исключение. Что, если пользователь вводит «1» вместо «истина» или что-то еще? Такой подход оставит такую ​​ошибку необнаруженной. Но теперь я знаю о функции Try, и это приятно.
user42723
16

Scala 2.13Introduction String::toBooleanOption, который в сочетании с Option::getOrElse, обеспечивает безопасный способ извлечения a Booleanкак String:

"true".toBooleanOption.getOrElse(false)  // true
"false".toBooleanOption.getOrElse(false) // false
"oups".toBooleanOption.getOrElse(false)  // false
Ксавье Гихот
источник
11

Примечание: не пишите new Boolean(myString)на Java - всегда используйте Boolean.valueOf(myString). Использование newварианта без необходимости создает Booleanобъект; использование valueOfварианта этого не делает.

Джеспер
источник
8

Проблема myString.toBooleanзаключается в том, что он выдаст исключение, если myString.toLowerCaseэто не совсем одно из "true"или "false"(даже лишний пробел в строке вызовет исключение).

Если вы хотите точно такое же поведение , как java.lang.Boolean.valueOf, а затем использовать его полным или импортировать Boolean под другим именем, например, import java.lang.{Boolean=>JBoolean}; JBoolean.valueOf(myString). Или написать свой собственный метод , который обрабатывает свои собственные особые обстоятельства (например, вы можете "t"быть trueтак же).

Кристиан Домагала
источник
1
Это неверно (больше). toLowerCase is done by toBoolean`
pme 02
1

Сегодня я получил удовольствие от этого, сопоставив набор значений 1/0 с логическим значением. Мне пришлось вернуться к Spark 1.4.1, и я, наконец, начал работать с:

Try(if (p(11).toString == "1" || p(11).toString == "true") true else false).getOrElse(false)) 

где p (11) - поле фрейма данных

в моей предыдущей версии не было "Попробовать", это работает, доступны другие способы сделать это ...

ТобиЭванс
источник
2
Вам не нужно использовать ifс, true else falseпотому что ваши условные возвраты trueили false. Все, что вам нужно, это Try(condition).getOrElse(false).
jwvh