Scala:文字列からブール値へのエレガントな変換


83

Javaでは次のように書くことができます Boolean.valueOf(myString)。ただし、Scalaでは、この機能が不足java.lang.Booleanscala.Booleanているために隠されています。ブール値の元のJavaバージョンを使用するように切り替えるのは簡単ですが、それは正しくないようです。

ではtrue、文字列から抽出するためのScalaの1行の標準的なソリューションは何ですか?


単純に正規表現を使用してみませんか?
ケビンメレディス

2
単純に聞こえるわけではありません。
JaimeHablutzel19年

回答:


143

ああ、私はばかげています。答えはmyString.toBooleanです。


9
myStringがnullの場合、コードは例外をスローします。次の回答アプローチをお勧めしますTry(myString.toBoolean).getOrElse(false)
Carlos Verdes

2
Try(myString.toBoolean).getOrElse(false)例外をスローしてキャッチする作業を行います。Option(myString).exists(_.toBoolean)その余分な努力を回避します。
sfosdal 2018年

1
使用Try(myString.toBoolean).getOrElse(false)は良いです。一致しない文字列をきれいに処理します。
NKM

109

これはどう:

import scala.util.Try

Try(myString.toBoolean).getOrElse(false)

入力文字列が有効なブール値に変換されない場合、false例外をスローするのではなく、返されます。この動作は、のJava動作によく似ていますBoolean.valueOf(myString)


例外はあなたが望むものだと思います。ユーザーが「true」などの代わりに「1」を入力した場合はどうなりますか?このアプローチでは、このようなエラーは検出されません。しかし今、私はTry関数について知っています。これは素晴らしいことです。
user42723 2017年


11

注:new Boolean(myString)Javaで記述しないでくださいBoolean.valueOf(myString)。常にを使用してください。newバリアントを使用すると、不必要にBooleanオブジェクトが作成されます。valueOfバリアントを使用しても、これは行われません。


8

の問題myString.toBooleanmyString.toLowerCase"true"またはのいずれかではない場合に例外がスローされることです。"false"(文字列に余分な空白がある場合でも、例外がスローされます)。

とまったく同じ動作が必要な場合はjava.lang.Boolean.valueOf、完全修飾で使用するか、ブール値を別の名前(たとえば、)でインポートしimport java.lang.{Boolean=>JBoolean}; JBoolean.valueOf(myString)ます。またはあなた自身の特定の状況(例えば、あなたがしたいことがあり扱う独自のメソッドを書く"t"ことtrueも)。


1
これは(もう)真実ではありません。toLowerCase is done by toBoolean`
pme

1

私は今日これを楽しんでいて、1/0の値のセットをブール値にマッピングしています。Spark 1.4.1に戻らなければならなかったのですが、ついに次のもので動作するようになりました。

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

ここで、p(11)はデータフレームフィールドです。

私の以前のバージョンには「試してみる」がありませんでした、これは機能します、それを行う他の方法が利用可能です...


2
条件付きリターンまたは。ifであるtrue else falseため、withは必要ありません。必要なのは。truefalseTry(condition).getOrElse(false)
jwvh 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.