W Javie możesz pisać Boolean.valueOf(myString)
. Jednak w Scali java.lang.Boolean
jest ukryty, przez scala.Boolean
który brakuje tej funkcji. Łatwo jest przełączyć się na oryginalną wersję boolean w Javie, ale to po prostu nie wydaje się właściwe.
Więc jakie jest jednowierszowe, kanoniczne rozwiązanie w Scali do wyodrębniania true
z łańcucha?
Odpowiedzi:
Ach, jestem głupi. Odpowiedź jest
myString.toBoolean
.źródło
Try(myString.toBoolean).getOrElse(false)
przejdzie przez pracę polegającą na rzucaniu i łapaniu wyjątku.Option(myString).exists(_.toBoolean)
unika tego dodatkowego wysiłku.Try(myString.toBoolean).getOrElse(false)
jest dobre. Czysto obsługuje niepasujący ciąg.Co powiesz na to:
import scala.util.Try Try(myString.toBoolean).getOrElse(false)
Jeśli ciąg wejściowy nie jest konwertowany na prawidłową wartość logiczną,
false
jest zwracany w przeciwieństwie do zgłaszania wyjątku. To zachowanie bardziej przypomina zachowanie Java programuBoolean.valueOf(myString)
.źródło
Scala 2.13
wprowadzoneString::toBooleanOption
, co w połączeniu zOption::getOrElse
, zapewnia bezpieczny sposób wyodrębnieniaBoolean
jakoString
:"true".toBooleanOption.getOrElse(false) // true "false".toBooleanOption.getOrElse(false) // false "oups".toBooleanOption.getOrElse(false) // false
źródło
Uwaga: nie pisz
new Boolean(myString)
w Javie - zawsze używajBoolean.valueOf(myString)
. Korzystanie znew
wariantu niepotrzebnie tworzyBoolean
obiekt; użycievalueOf
wariantu tego nie robi.źródło
Problem
myString.toBoolean
polega na tym, że zgłosi wyjątek, jeślimyString.toLowerCase
nie jest dokładnie jednym z"true"
lub"false"
(nawet dodatkowy biały znak w ciągu spowoduje wyrzucenie wyjątku).Jeśli chcesz uzyskać dokładnie to samo zachowanie
java.lang.Boolean.valueOf
, użyj go w pełni kwalifikowanego lub zaimportuj wartość Boolean pod inną nazwą, npimport java.lang.{Boolean=>JBoolean}; JBoolean.valueOf(myString)
.. Lub wyraź swoją własną metodę, która obsługuje własnych szczególnych okolicznościach (np, można"t"
byćtrue
również).źródło
toLowerCase is done by
toBoolean`Bawiłem się tym dzisiaj, mapując zestaw wartości 1/0 na boolean. Musiałem wrócić do Spark 1.4.1 i w końcu udało mi się to współpracować z:
Try(if (p(11).toString == "1" || p(11).toString == "true") true else false).getOrElse(false))
gdzie p (11) jest polem ramki danych
moja poprzednia wersja nie miała opcji „Wypróbuj”, to działa, dostępne są inne sposoby ...
źródło
if
z,true else false
ponieważ zwroty warunkowetrue
lubfalse
. Wszystko czego potrzebujesz toTry(condition).getOrElse(false)
.