2009-09-24 9 views
56

En Java puede escribir Boolean.valueOf(myString). Sin embargo, en Scala, java.lang.Boolean está oculto por scala.Boolean que carece de esta función. Es bastante fácil pasar a usar la versión Java original de un booleano, pero eso simplemente no parece correcto.Scala: Conversión elegante de una cadena en un booleano

¿Cuál es la solución canónica de una línea en Scala para extraer true de una cadena?

+0

¿Por qué no simplemente usar una expresión regular? –

Respuesta

99

Ah, soy tonto. La respuesta es myString.toBoolean.

+2

Si myString es nulo, su código arrojará una excepción, prefiero el siguiente enfoque de respuesta Try (myString.toBoolean) .getOrElse (falso) –

10

Nota: No escriba new Boolean(myString) en Java - siempre use Boolean.valueOf(myString). El uso de la variante new crea innecesariamente un objeto Boolean; usar la variante valueOf no hace esto.

9

El problema con myString.toBoolean es que va a lanzar una excepción si myString.toLowerCase no es exactamente uno de "true" o "false" (incluso el espacio en blanco adicional en la cadena provocará una excepción a ser lanzado).

Si desea exactamente el mismo comportamiento que java.lang.Boolean.valueOf, utilícelo como totalmente calificado o importe Boolean con un nombre diferente, por ejemplo, import java.lang.{Boolean=>JBoolean}; JBoolean.valueOf(myString). O escriba su propio método que maneje sus propias circunstancias particulares (por ej., Puede querer que "t" sea true también).

70

¿Qué tal esto:

import scala.util.Try 

Try(myString.toBoolean).getOrElse(false) 

Si la cadena de entrada no se convierte en un valor booleano válido false se devuelve en lugar de lanzar una excepción. Este comportamiento se parece más al comportamiento de Java de Boolean.valueOf(myString).

+1

Esto definitivamente debería marcar como la respuesta correcta – Giorgio

+0

Creo que una excepción es lo que quiere. ¿Qué pasa si el usuario ingresa "1" en lugar de "verdadero" o algo más? Este enfoque dejará sin detectar ese error. Pero ahora sé sobre la función Try, que es agradable. – user42723

0

Me he estado divirtiendo con esto hoy, mapeando un conjunto de valores 1/0 a booleano. Tenía que volver a Spark 1.4.1 y por fin tengo trabajo con:

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

donde p (11) es el campo trama de datos

mi versión precedente no tenía la "Prueba" , esto funciona, otras formas de hacerlo están disponibles ...

+1

No necesita el 'si' con' true else false' porque su condicional devuelve 'true' o' false'. Todo lo que necesitas es 'Try (condition) .getOrElse (false)'. – jwvh

Cuestiones relacionadas