In Java kun je Boolean.valueOf(myString)
schrijven. In Scala wordt java.lang.Boolean
echter verborgen door scala.Boolean
die deze functie niet heeft. Het is gemakkelijk genoeg om over te schakelen naar het gebruik van de originele Java-versie van een boolean, maar dat lijkt gewoon niet juist.
Dus wat is de eenregelige, canonieke oplossing in Scala voor het extraheren van true
uit een string?
Antwoord 1, autoriteit 100%
Ah, ik ben dom. Het antwoord is myString.toBoolean
.
Antwoord 2, autoriteit 73%
Wat dacht je hiervan:
import scala.util.Try
Try(myString.toBoolean).getOrElse(false)
Als de invoerreeks niet wordt geconverteerd naar een geldige Booleaanse waarde, wordt false
geretourneerd in plaats van een uitzondering te genereren. Dit gedrag lijkt meer op het Java-gedrag van Boolean.valueOf(myString)
.
Antwoord 3, autoriteit 16%
Scala 2.13
introduceerde String::toBooleanOption
, gecombineerd tot Option::getOrElse
, biedt een veilige manier om een Boolean
als een String
te extraheren:
"true".toBooleanOption.getOrElse(false) // true
"false".toBooleanOption.getOrElse(false) // false
"oups".toBooleanOption.getOrElse(false) // false
Antwoord 4, autoriteit 7%
Opmerking: Schrijf new Boolean(myString)
niet in Java – gebruik altijd Boolean.valueOf(myString)
. Het gebruik van de new
variant maakt onnodig een Boolean
object; het gebruik van de variant valueOf
doet dit niet.
Antwoord 5, autoriteit 5%
Het probleem met myString.toBoolean
is dat het een uitzondering genereert als myString.toLowerCase
niet precies een van "true"
is of "false"
(zelfs extra witruimte in de tekenreeks zorgt ervoor dat er een uitzondering wordt gegenereerd).
Als je precies hetzelfde gedrag wilt als java.lang.Boolean.valueOf
, gebruik het dan volledig gekwalificeerd, of importeer Boolean onder een andere naam, bijvoorbeeld import java.lang.{Boolean=>JBoolean}; JBoolean.valueOf(myString)
. Of schrijf uw eigen methode die uw eigen specifieke omstandigheden afhandelt (u kunt bijvoorbeeld willen dat "t"
ook true
is).
Antwoord 6
Ik heb hier vandaag veel plezier mee gehad, waarbij ik een 1/0 set waarden toewijs aan boolean. Ik moest terug naar Spark 1.4.1 en ik heb het eindelijk werkend gekregen met:
Try(if (p(11).toString == "1" || p(11).toString == "true") true else false).getOrElse(false))
waarbij p(11) het dataframeveld is
mijn vorige versie had niet de “Probeer”, dit werkt, andere manieren om het te doen zijn beschikbaar …