Scala:将字符串优雅转换为布尔值

时间:2009-09-24 07:28:11

标签: scala

在Java中,您可以编写Boolean.valueOf(myString)。但是在Scala中,java.lang.Boolean隐藏了scala.Boolean,而true缺少此功能。切换到使用原始Java版本的布尔值很容易,但这似乎不对。

那么Scala中用于从字符串中提取{{1}}的单行,规范解决方案是什么?

6 个答案:

答案 0 :(得分:117)

啊,我很傻。答案是myString.toBoolean

答案 1 :(得分:87)

这个怎么样:

import scala.util.Try

Try(myString.toBoolean).getOrElse(false)

如果输入字符串未转换为有效的布尔值,则返回false而不是抛出异常。此行为更类似于Boolean.valueOf(myString)的Java行为。

答案 2 :(得分:10)

注意:不要在Java中编写new Boolean(myString) - 始终使用Boolean.valueOf(myString)。使用new变体不必要地创建Boolean对象;使用valueOf变体不会这样做。

答案 3 :(得分:9)

myString.toBoolean的问题是,如果myString.toLowerCase不是"true""false"中的一个,则会引发异常(即使字符串中有额外的空格也是如此)导致抛出异常)。

如果您想要与java.lang.Boolean.valueOf完全相同的行为,请使用完全限定,或使用其他名称导入布尔值,例如import java.lang.{Boolean=>JBoolean}; JBoolean.valueOf(myString)。或者编写自己的方法来处理自己的特定情况(例如,您可能希望"t"也是true

答案 4 :(得分:1)

今天我一直很开心,将1/0的值映射到布尔值。我不得不回到Spark 1.4.1,我终于得到了它:

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

其中p(11)是数据帧字段

我之前的版本没有“尝试”,这是有效的,其他方式可用...

答案 5 :(得分:0)

Scala 2.13引入了String::toBooleanOption,并结合到Option::getOrElse,为提取Boolean作为String提供了一种安全的方法:

"true".toBooleanOption.getOrElse(false)  // true
"false".toBooleanOption.getOrElse(false) // false
"oups".toBooleanOption.getOrElse(false)  // false