Scala: Elegante Umwandlung eines Strings in einen Booleschen Wert

83

In Java können Sie schreiben Boolean.valueOf(myString). Allerdings ist in Scala java.lang.Booleanverborgen, scala.Booleanwodurch diese Funktion fehlt. Es ist einfach genug, auf die ursprüngliche Java-Version eines Booleschen Werts umzusteigen, aber das scheint einfach nicht richtig zu sein.

Was ist also die einzeilige, kanonische Lösung in Scala zum Extrahieren trueaus einer Zeichenfolge?

David Crawshaw
quelle
Warum nicht einfach einen regulären Ausdruck verwenden?
Kevin Meredith
2
Es klingt überhaupt nicht einfach.
Jaime Hablutzel

Antworten:

143

Ah, ich bin dumm. Die Antwort lautet myString.toBoolean.

David Crawshaw
quelle
9
Wenn myString null ist, wird Ihr Code eine Ausnahme auslösen. Ich bevorzuge den nächsten Antwortansatz. Try (myString.toBoolean) .getOrElse (false)
Carlos Verdes
2
Try(myString.toBoolean).getOrElse(false)wird durch die Arbeit des Werfens und Fangens der Ausnahme gehen. Option(myString).exists(_.toBoolean)vermeidet diesen zusätzlichen Aufwand.
sfosdal
1
Verwenden Try(myString.toBoolean).getOrElse(false)ist gut. Behandelt nicht übereinstimmende Zeichenfolgen sauber.
NKM
108

Wie wäre es damit:

import scala.util.Try

Try(myString.toBoolean).getOrElse(false)

Wenn die Eingabezeichenfolge nicht in einen gültigen Booleschen Wert konvertiert wird, falsewird zurückgegeben, anstatt eine Ausnahme auszulösen. Dieses Verhalten ähnelt eher dem Java-Verhalten von Boolean.valueOf(myString).

user24601
quelle
Ich denke, eine Ausnahme ist das, was Sie wollen. Was ist, wenn der Benutzer "1" anstelle von "true" oder etwas anderem eingibt? Dieser Ansatz lässt einen solchen Fehler unentdeckt. Aber jetzt weiß ich über die Try-Funktion Bescheid, was sehr schön ist.
user42723
14

Scala 2.13eingeführt String::toBooleanOption, die kombiniert Option::getOrElse, bietet eine sichere Möglichkeit, a Booleanals zu extrahieren String:

"true".toBooleanOption.getOrElse(false)  // true
"false".toBooleanOption.getOrElse(false) // false
"oups".toBooleanOption.getOrElse(false)  // false
Xavier Guihot
quelle
11

Hinweis: Schreiben Sie nicht new Boolean(myString)in Java - verwenden Sie immer Boolean.valueOf(myString). Durch die Verwendung der newVariante wird unnötigerweise ein BooleanObjekt erstellt. Die Verwendung der valueOfVariante macht dies nicht.

Jesper
quelle
8

Das Problem dabei myString.toBooleanist, dass eine Ausnahme ausgelöst wird, wenn dies myString.toLowerCasenicht genau einer von "true"oder ist "false"(selbst ein zusätzlicher Leerraum in der Zeichenfolge führt dazu, dass eine Ausnahme ausgelöst wird).

Wenn Sie genau das gleiche Verhalten wie möchten java.lang.Boolean.valueOf, verwenden Sie es vollständig qualifiziert oder importieren Sie Boolean unter einem anderen Namen, z import java.lang.{Boolean=>JBoolean}; JBoolean.valueOf(myString). Oder schreiben Sie Ihre eigene Methode, die Ihre besonderen Umstände behandelt (z. B. möchten Sie es vielleicht "t"sein)true als auch).

Kristian Domagala
quelle
1
Dies ist (nicht mehr) wahr. toLowerCase is done by toBoolean`
pme
1

Ich habe heute Spaß damit gehabt und einen 1/0 Satz von Werten auf Boolean abgebildet. Ich musste auf Spark 1.4.1 zurückgreifen und habe es endlich zum Laufen gebracht mit:

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

Dabei ist p (11) das Datenrahmenfeld

Meine vorherige Version hatte nicht das "Try", das funktioniert, andere Möglichkeiten sind verfügbar ...

TobyEvans
quelle
2
Sie brauchen das nicht ifmit dem, true else falseweil Ihre bedingte Rückgabe trueoder false. Alles was Sie brauchen ist Try(condition).getOrElse(false).
Jwvh