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


83

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

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


为什么不简单地使用正则表达式呢?
凯文·梅雷迪斯

2
听起来一点都不简单。
Jaime Hablutzel '19年

Answers:


143

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


9
如果myString为null,则您的代码将引发Exception,我更喜欢下一个答案方法Try(myString.toBoolean).getOrElse(false)
Carlos Verdes

2
Try(myString.toBoolean).getOrElse(false)将处理引发和捕获异常的工作。Option(myString).exists(_.toBoolean)避免了额外的努力。
sfosdal

1
使用Try(myString.toBoolean).getOrElse(false)是好的。干净地处理不匹配的字符串。
NKM

109

这个怎么样:

import scala.util.Try

Try(myString.toBoolean).getOrElse(false)

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


我认为您想要的是例外。如果用户输入“ 1”而不是“ true”或其他内容怎么办?这种方法将不会发现这种错误。但是现在我知道了Try函数,这很好。
user42723

14

Scala 2.13引入String::toBooleanOption,其组合,以Option::getOrElse提供一个安全的方式来提取Boolean作为String

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

11

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


8

问题myString.toBoolean在于,如果myString.toLowerCase不完全是"true"或之一,它将引发异常"false"(即使字符串中多余的空格也会引发异常)。

如果您想要与完全相同的行为java.lang.Boolean.valueOf,请使用完全限定的行为,或以其他名称(例如)导入Boolean 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因为您的条件返回值为truefalse。您所需要的就是Try(condition).getOrElse(false)
jwvh
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.