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?


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.


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).


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

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.


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).


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 ...


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.