2009-09-24 8 views
56

Javaでは、Boolean.valueOf(myString)と書くことができます。しかし、Scalaではjava.lang.Booleanがこの機能を持たないscala.Booleanによって隠されています。ブール値の元のJavaバージョンを使用するように切り替えるのは簡単ですが、それはちょうど正しいとは限りません。スカラ:文字列をブール値にエレガントに変換

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

+0

単純に正規表現を使用してみませんか? –

答えて

99

ああ、私は愚かです。答えはmyString.toBooleanです。

+2

myStringがnullの場合、コードがExceptionをスローします。次の応答方法が好きです。try(myString.toBoolean).getOrElse(false) –

10

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

9

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

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

70

これはどう:

import scala.util.Try 

Try(myString.toBoolean).getOrElse(false) 

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

+1

これは間違いなく正しい答えとマークしてください。 – Giorgio

+0

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

0

私は今日、この1/0値セットをブール値にマッピングして楽しんでいます。私は1.4.1をスパークに戻す必要があった、と私は最終的にそれがで作業しました:

Try(if (p(11).toString == "1" || p(11).toString == "true") true else false).getOrElse(false)) 
P(11)がデータフレームのフィールドにある

私の以前のバージョンでは、「お試し」を持っていませんでしたこれはうまくいきます。

+1

あなたの条件が 'true'または' false'を返すので、 'true' else''で' if'を使う必要はありません。必要なのは、 'Try(condition).getOrElse(false)'だけです。 – jwvh

関連する問題