2009-09-24 7 views
56

En Java, vous pouvez écrire Boolean.valueOf(myString). Cependant, dans Scala, java.lang.Boolean est masqué par scala.Boolean qui n'a pas cette fonction. Il est assez facile de passer à l'utilisation de la version Java originale d'un booléen, mais cela ne semble pas correct.Scala: conversion élégante d'une chaîne en un booléen

Alors, quelle est la solution canonique d'une ligne dans Scala pour extraire true d'une chaîne?

+0

Pourquoi ne pas simplement utiliser une expression régulière? –

Répondre

99

Ah, je suis stupide. La réponse est myString.toBoolean.

+2

Si myString est null votre code jettera une exception, je préfère la prochaine réponse approche Try (myString.toBoolean) .getOrElse (false) –

10

Remarque: N'écrivez pas new Boolean(myString) en Java - utilisez toujours Boolean.valueOf(myString). L'utilisation de la variante new crée inutilement un objet Boolean; l'utilisation de la variante valueOf ne le fait pas.

9

Le problème avec myString.toBoolean est qu'il lancera une exception si myString.toLowerCase est pas exactement une des "true" ou "false" (même espace blanc supplémentaire dans la chaîne provoquera une exception à jeter).

Si vous voulez exactement le même comportement que java.lang.Boolean.valueOf, utilisez-le entièrement qualifié ou importez Boolean sous un autre nom, par exemple import java.lang.{Boolean=>JBoolean}; JBoolean.valueOf(myString). Ou écrivez votre propre méthode qui gère vos propres circonstances particulières (par exemple, vous voudrez peut-être "t" être aussi true).

70

Que diriez-vous ceci:

import scala.util.Try 

Try(myString.toBoolean).getOrElse(false) 

Si la chaîne d'entrée ne convertit pas à une valeur booléenne valide false est retourné au lieu de lancer une exception. Ce comportement ressemble plus au comportement Java de Boolean.valueOf(myString).

+1

Cela devrait certainement marquer comme la bonne réponse – Giorgio

+0

Je pense qu'une exception est ce que vous voulez. Que faire si l'utilisateur entre "1" au lieu de "vrai" ou autre chose? Cette approche laissera une telle erreur non détectée. Mais maintenant je connais la fonction Try, ce qui est sympa. – user42723

0

Je me suis amusé avec ceci aujourd'hui, mappant un ensemble de valeurs 1/0 à booléen. Je devais revenir à Spark 1.4.1, et je l'ai finalement obtenu de travailler avec:

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

où p (11) est le champ dataframe

ma version précédente n'a pas eu la « Try » , cela fonctionne, d'autres façons de le faire sont disponibles ...

+1

Vous n'avez pas besoin du 'if' avec le' true else false' car vos renvois conditionnels 'true' ou' false'. Tout ce dont vous avez besoin est Try (condition) .getOrElse (false) '. – jwvh

Questions connexes