斯卡拉方式将任意数字转换为双数
问题描述:
我需要做一些原始数据解析,我不得不使用Any
类型。如果我读取的数据是任何数字格式(Int/Double/Long/...),我需要将它转换为double,否则(例如String)我需要将其保留为空。这是我想出来的:斯卡拉方式将任意数字转换为双数
def extractDouble(expectedNumber: Any): Option[Double] = expectedNumber match {
case i: Int => Some(i.toDouble)
case l: Long => Some(l.toDouble)
case d: Double => Some(d)
case _ => None
}
这obvoiusly看起来并没有甚至体面。在scala中有没有更好的方法来处理这个问题?
答
一旦你在编译时丢失了您的类型信息,因为它发生在你的情况,因为你的输入类型是Any
作为其要求的一部分,还有比在运行时isInstanceOf
检查expectedNumber
没有更多的选择。
这是由您在您提出的解决方案中执行的类型模式匹配的实现所掩盖。我认为这是您案例中的最佳解决方案。
但是,有一种替代方法是使用Try
并将其转换为Option
。例如:
Try(expectedNumber.toString.toDouble).toOption
这是一个在很多方面一个肮脏的解决方案(没有效率可言,用异常来控制流量,...),其我会definetively使用第一种方法
答
import scala.util.Try
def parseDouble(s: String): Option[Double] = Try { s.toDouble }.toOption
很难听到它,但我想你是对的;) – Niemand