在读取数据文件后,我需要将一些字符串值转换为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)