scala - Scala中的泛型类型解析与默认值
问题描述
我正在寻找一种通用的函数方法来将 Scala String 转换为任何数字类型。我需要在失败的情况下传递默认值。
例如,我需要从 to 转换String
,Int
但万一 String 到 Int 转换失败。我需要传递一个默认值而没有throws java.lang.NumberFormatException
. 我尝试过这种方式,但没有得到我的想法,因为我需要它是通用的,并且在异常情况下也需要默认值
解决方案
编辑:我更新了从任何类型解析为任何类型的解决方案。这使得解决方案根据所请求的问题更加通用。我认为您可以使用 Scala 函数方式来获得泛型类型[T]
,但您需要将其分成两部分。
首先实现从任何类型解析为任何类型的解析[U]
类型[T]
。parseTypes
使用 Scala 函数方式将函数canBuildFrom
作为参数。然后根据此函数的输出,您将检查它是否正确解析或是否有异常。此外,如果它无法解析,您可以传递一个默认参数。
def parseTypes[T,U](str: U, canBuildFrom: U ⇒ T): Either[java.lang.NumberFormatException, T] =
Try(canBuildFrom(str)).map(Right(_)).getOrElse {
Left(new java.lang.NumberFormatException(str.toString))
}
def safeParse[T,U](attributeValue: U, canBuildFrom: U ⇒ T, defaultValue: T): T = {
parseTypes(attributeValue, canBuildFrom) match {
case Right(x) ⇒ x
case Left(x) ⇒ defaultValue
case _ ⇒ defaultValue
}
}
def safeParseDoubleToBigDecimal(attributeValue: Double): BigDecimal = safeParse[BigDecimal,Double](attributeValue, toBigDecimal, 0.0)
您可以使用它将 String 解析为 Int、Double 和 Decimal,如下所示:
def safeParseStringToInt(attributeValue: String): Int = safeParse[Int,String](attributeValue, _.toInt, 0)
def safeParseStringToDouble(attributeValue: String): Double = safeParse[Double ,String](attributeValue, _.toDouble, 0.0)
def safeParseStringToBigDecimal(attributeValue: String): BigDecimal = safeParse[BigDecimal ,String](attributeValue, BigDecimal(_), 0.0)
// example of usage
val x:Int = safeParseStringToInt("123",0)
val y:Int = safeParseStringToInt("aaa",0)
更新:我更新了这个答案,因为我意识到@Dima 的答案在某种程度上比我的答案更实用和更好我添加了从@Dima 的答案复制的下面的答案作为我的答案标记为正确答案。
trait ParseIt[T] {
protected def parse(s: String): T
def apply(s: String) = Try(parse(s)).toOption
}
implicit object ParseInt extends ParseIt[Int] {
protected def parse(s: String) = s.toInt
}
implicit object ParseDouble extends ParseIt[Double] {
protected def parse(s: String) = s.toDouble
}
// etc ...
def parse[T : ParseIt](s: String, orElse: => T) =
implicitly[ParseIt[T]](s).getOrElse(orElse)
val n: Int = parse("123", 0)
val d: Double = parse("123", 0.0)
推荐阅读
- zooming - 如何在 NSScrollView 中动画放大和缩小以使其平滑?
- python - Python MySQL 连接器:无法使用 SSL 连接到服务器
- python - 如何在 model.fit() 上加速 for 循环?
- assembly - MIPS 程序卡在嵌套函数上
- go - go中的存储库模式和联接表
- django - 如何在 Django 的“main.css”中提供图像路径?
- mongodb - MongoDB查询返回三个不同组下的条目计数
- python-3.x - 在 python 3 中模仿 C++ 行为
- python - Pyarrow 错误 - AttributeError:模块 'pyarrow' 没有属性 'feather'
- machine-learning - 机器学习中的宏观平均和加权平均有区别吗?