scala中从Option [Double]到Double的转换错误

时间:2016-11-16 16:48:11

标签: scala apache-spark scala-collections

我在从Option [Double]转换为Double时遇到问题。我收到以下异常错误:

scala.Some cannot be cast to java.lang.Double

val ty = ttnew.distinct().leftOuterJoin(rank).map{ case ((key),(c,d)) => (key,c._1,c._2,c._3,d.getOrElse(Double).asInstanceOf[Double]) }

请帮助!

2 个答案:

答案 0 :(得分:8)

d

毫无意义。

假设Option[Double]Double,如果您想要Option,则无法投放它,您需要获取“{1}}之外的值。” / p>

getOrElse允许您获取值(如果存在),并在缺席时提供后备值(即None)。

例如:

d.getOrElse(0) // 0, or anything that makes sense as a fallback

如果d的类型为Option[Double],则d.getOrElse(0)的类型为Double

答案 1 :(得分:5)

这不是你处理Option的方式。使用.getOrElse.map

val ty=ttnew.distinct().leftOuterJoin(rank).map{ case ((key),(c,d)) => (key,c._1,c._2,c._3,d.getOrElse(Double).asInstanceOf[Double]) }

可能(在这种情况下)你会想d.getOrElse(<a-good-default-value-like-zero-maybe>)

其他情况可能您希望传播Option的含义(该值可能不存在),在这种情况下您应该使用.map

val res: Option[String] = optionalDouble.map(doubleValue => callSomeFunctionThatConvertsDoubleToString(value))

你甚至可以使用模式匹配和提取器来做其他事情。例如,使用.collect(它是.map,但可能有未涵盖的情况):

val ty=ttnew.distinct().leftOuterJoin(rank).collect{ case ((key),(c,Some(d))) => (key,c._1,c._2,c._3,d) }