为抛出异常的函数计算布尔值的功能方法

时间:2014-06-06 04:40:55

标签: scala exception-handling functional-programming

我正在尝试编写以下函数而不使用var且只使用val。任何想法如何处理这个?

  def isValidBSONId(id: String): Boolean = {
    var valid: Boolean = false
    import reactivemongo.bson.utils.Converters._
    try {
      str2Hex(id)
      valid = true
    } catch  {
      case _ => valid = false
    }
    valid
  }

4 个答案:

答案 0 :(得分:5)

str2Hex(id)中包含对Try的调用,然后对SuccessFailure案例类的结果进行模式匹配。您可以针对Success案例返回true,或针对Failure案例返回false。最好只返回Try,这样调用代码就没有if else块,并且可以对组成更好的结果进行模式匹配。

def isValidBSONId(id: String): Boolean = {
  import reactivemongo.bson.utils.Converters._
  Try(str2Hex(id)) match {
    case Success(s) => true
    case Failure(e) => false
  }
}

答案 1 :(得分:5)

只需Try{}.isSuccess

def isValidBSONId(id: String): Boolean = {
  import reactivemongo.bson.utils.Converters._
  Try(str2Hex(id)).isSuccess
}

答案 2 :(得分:3)

只是:

  def isValidBSONId(id: String): Boolean = {
    import reactivemongo.bson.utils.Converters._
    try {
      str2Hex(id)
      true
    } catch  {
      case _ =>  false
    }
  }

方法或函数中执行的最后一个表达式将成为其返回值。如果失败,您肯定会捕获特定的异常str2Hex抛出,因为可能存在您不希望为此目的捕获的运行时错误。

使用Try monad更加惯用,您可能会这样使用:

  def checkBSONId(id: String): Try[String] = Try { str2Hex(id) }

然后你可以做各种有趣的monadic东西,如map over或结果上的模式匹配。

答案 3 :(得分:0)

还要考虑

def isValidBSONId(id: String): Boolean = 
  Try(reactivemongo.bson.utils.Convertersstr2Hex(id)) toOption != None

如果Try(str2Hex(id))触发了异常,则toOption会传递None,因此根据不等式,该方法将返回false,否则该方法将返回true。< / p>