Scala: Елегантне перетворення рядка в логічну форму


84

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

То яке одноканальне канонічне рішення у Scala для вилучення trueз рядка?


Чому б просто не використовувати регулярний вираз?
Кевін Мередіт,

2
Це звучить зовсім не просто.
Хайме Хаблуцель

Відповіді:


144

Ах, я дурна. Відповідь така myString.toBoolean.


9
Якщо myString має значення null, ваш код видасть виняток, я віддаю перевагу наступному підходу до відповіді Try (myString.toBoolean) .getOrElse (false)
Carlos Verdes

2
Try(myString.toBoolean).getOrElse(false)пройде роботу по киданню та лові винятку. Option(myString).exists(_.toBoolean)уникає зайвих зусиль.
sfosdal

1
Використовувати Try(myString.toBoolean).getOrElse(false)добре. Чисто обробляє невідповідний рядок.
NKM

110

Як щодо цього:

import scala.util.Try

Try(myString.toBoolean).getOrElse(false)

Якщо вхідний рядок не перетворюється на дійсне булеве значення false, повертається на відміну від видавання виключення. Ця поведінка більше нагадує поведінку Java Boolean.valueOf(myString).


Я думаю, виняток - це те, що ви хочете. Що робити, якщо користувач вводить "1" замість "true" чи щось інше? Такий підхід залишить таку помилку непоміченою. Але тепер я знаю про функцію Спробувати, що приємно.
user42723

14

Scala 2.13введений String::toBooleanOption, який у поєднанні з Option::getOrElse, забезпечує безпечний спосіб вилучення 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варіанту без потреби створює aBoolean об’єкт; використання 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

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
Вам не потрібен параметр the ifз, true else falseоскільки ваші умовні повернення trueабо false. Все, що вам потрібно - це Try(condition).getOrElse(false).
jwvh
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.