【问题标题】:Scala: Elegant conversion of a string into a booleanScala:将字符串优雅地转换为布尔值
【发布时间】:2009-09-24 07:28:11
【问题描述】:

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

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

【问题讨论】:

  • 为什么不简单地使用正则表达式?
  • 听起来一点都不简单。

标签: scala


【解决方案1】:

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

【讨论】:

  • 如果 myString 为 null 您的代码将抛出异常,我更喜欢下一个答案方法 Try(myString.toBoolean).getOrElse(false)
  • Try(myString.toBoolean).getOrElse(false) 将完成抛出和捕获异常的工作。 Option(myString).exists(_.toBoolean) 避免了额外的努力。
  • 使用Try(myString.toBoolean).getOrElse(false) 很好。干净地处理不匹配的字符串。
【解决方案2】:

这个怎么样:

import scala.util.Try

Try(myString.toBoolean).getOrElse(false)

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

【讨论】:

  • 我认为你想要一个例外。如果用户输入“1”而不是“true”或其他内容怎么办?这种方法不会检测到这样的错误。但是现在我知道了 Try 函数,这很好。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

      • 这不是真的(不再)。 toLowerCase is done by toBoolean`
      【解决方案6】:

      我今天玩得很开心,将一组 1/0 的值映射为布尔值。我不得不恢复到 Spark 1.4.1,我终于可以使用它了:

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

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

      我以前的版本没有“Try”,这个可以,其他方法也可以......

      【讨论】:

      • 您不需要iftrue else false,因为您的条件返回truefalse。您只需要Try(condition).getOrElse(false)
      猜你喜欢
      • 2018-09-07
      • 1970-01-01
      • 2012-03-10
      • 2012-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多