【发布时间】:2016-12-22 13:47:27
【问题描述】:
我想知道如何避免将Any 转换为String,而是使用模式匹配。
已从 spark like df.select('column).first.toSeq.head 收集数据帧
直接投射是一种解决方法df.select('column).first.toSeq.head.asInstanceOf[String],但是
我更喜欢使用 scala 原生模式匹配,例如
val collectedFromSpark: Any = "someString"
val realString:String = collectedFromSpark match{
case s:String => _
case _ => throw new Exception("expected something else")
}
但是,realString:String 只接收Any 而不是String。
如何以 scala 原生方式制定此演员表?
【问题讨论】:
-
将您的案例更改为
case s: String => s是否有效? -
是的。这就是解决方案。
-
注意 - 使用
case s: String是 Scala 中的代码异味,因为您正在创建运行时,即不是编译时,请检查。我建议在Parametricity 上进行此演讲。 -
那你还有什么推荐的?
-
@KevinMeredith 当您拥有
Any类型的对象时,您无法避免运行时检查。我想说这里真正的代码味道,首先是有一个Any类型的对象。