Scala:成功地检查空/空值并返回0

  • 本文关键字:空值 返回 成功 Scala scala
  • 更新时间 :
  • 英文 :


在读取数据文件后,我需要将一些字符串值转换为Ints。该字段可能为空,这将在尝试进行转换时导致错误。有没有一种简单的方法可以检查null(或者一个可以转换为整数的适当值),如果不能转换,只返回0?getOrElse似乎是一种可能性,但我无法将其应用于写作。我可以写一个很容易完成的函数,但我希望有一种更优雅/简洁的方法来完成这件事。

您可以使用Try monad(此处记录),它有一个getOrElse方法:

import scala.util.Try
val zero = Try { "foo".toInt }.getOrElse(0)
val leet = Try { "1337".toInt }.getOrElse(0)
val parseOrZero: String => Int = x => Try(x.toInt) getOrElse 0
val lines = Seq("123", "42", "sdfd", null, "")
lines.map(parseOrZero)
->> res0: Seq[Int] = List(123, 42, 0, 0, 0)

或在线:

lines.map(x => Try(x.toInt) getOrElse 0)

Try还有一个toOption方法,如果成功,它将获得Some(value),或者在异常时获得None。因此,如果您想过滤掉坏条目而不是返回0,您可以执行以下操作:

lines.flatMap(x => Try(x.toInt).toOption)

CCD_ 8还具有所有有用的一元变换,如CCD_ 9和CCD_。

默认的toInt函数抛出异常,但您可以提供一个更安全的版本,返回Option,然后在其上使用getOrElse

def toInt(s: String): Option[Int] =
  try {
    Some(s.toInt)
  } catch {
    case e: Exception => None
  }
toInt("42").getOrElse(0) // 42
toInt("foo").getOrElse(0) // 0

或者,您可以使用scalaz,它在String上提供parseInt方法,返回Validation[NumberFormatException, Int],您可以将其转换为Option。示例:

"42".parseInt.toOption.getOrElse(0) // 42
"foo".parseInt.toOption.getOrElse(0) // 0

仅转换整数值:

val lines = Seq("123", "42", "sdfd", null, "")  // read strings from anywhere
val result = lines
  .filter(s => Option(s).isDefined)   // drop null values
  .filter(_.matches("\d+"))          // drop non integer values
  .map(Integer.parseInt)              // convert to int
result: Seq[Int] = List(123, 42)

或者返回0而不是错误:

val lines = Seq("123", "42", "sdfd", null, "") // read strings from anywhere
def convert(s: String): Int =
  Option(s)
    .filter(_.matches("\d+"))
    .map(Integer.parseInt)
    .getOrElse(0)
val result = lines.map(convert)
result: Seq[Int] = List(123, 42, 0, 0, 0)

最新更新