scala - 在 Scala 中转换多个 optional 值

标签 scala type-conversion optional

我正在编写一个接收几个 optional 函数 String值并将每个值转换为 IntBoolean然后将转换后的值传递给 Unit进一步处理的功能。如果任何转换失败,整个函数都应该失败并显示错误。如果所有转换都成功,则该函数应处理转换后的值并返回成功。

这是我写的函数(从实际简化):

f(x: Option[String], y: Option[String], z: Option[String]): Result = {
  val convertX = x.map(value => Try(value.toInt))
  val convertY = y.map(value => Try(value.toBoolean))
  val convertZ = z.map(value => Try(value.toBoolean))

  val failuresExist =
    List(convertX, convertY, convertZ).flatten.exists(_.isFailure)

  if (failuresExist) BadRequest("Cannot convert input")
  else {
    convertX.foreach {
      case Success(value) => processX(value)
      case _ =>
    }

    convertY.foreach {
      case Success(value) => processY(value)
      case _ =>
    }

    convertZ.foreach {
      case Success(value) => processZ(value)
      case _ =>
    }

    Ok()
  }
}

虽然这个解决方案可能会奏效,但它非常尴尬。我该如何改进?

最佳答案

如果你不介意的话,更命令式的风格也可以。

def f(x: Option[String], y: Option[String], z: Option[String]): Result = {
    try {
        val convertX = x.map(_.toInt)
        val convertY = y.map(_.toBoolean)
        val convertZ = z.map(_.toBoolean)
        convertX.foreach(processX)
        convertY.foreach(processY)
        convertZ.foreach(processZ)
        Ok()
    } catch {
        case _: IllegalArgumentException | _: NumberFormatException => BadRequest("Cannot convert input")
    }
}

关于scala - 在 Scala 中转换多个 optional 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30325435/

相关文章:

scala - 简化 Scala 中的 Option[Boolean] 表达式

Scala,Quill - 如何比较不区分大小写的值?

scala - REST (Squeryl/Akka/Spray) - 非常低的吞吐量

在 C 中将 unsigned long long 转换为 double

c++ - 为什么 C++ 标准要求编译器忽略对基本类型的转换运算符的调用?

kotlin - 将选项列表映射到字符串列表

scala - 在 Scala Trait 中使用 self 类型作为返回类型

scala - 监控封闭图 Akka Stream

c# - 使用 foreach 遍历 WPF DataGrid

f# - 当 Option 的值为 'None' 时动态确定它的类型