我正在用scala编写一个hiveudf(因为我想学习scala)。为此,我必须重写三个函数: evaluate
, initialize
以及 getDisplayString
.
在初始化函数中,我必须:
接收一组 ObjectInspector
并返回一个 ObjectInspector
检查数组是否为空
检查数组的大小是否正确
检查数组是否包含正确类型的对象
为此,我使用了模式匹配,并提供了以下函数:
override def initialize(genericInspectors: Array[ObjectInspector]): ObjectInspector = genericInspectors match {
case null => throw new UDFArgumentException(functionNameString + ": ObjectInspector is null!")
case _ if genericInspectors.length != 1 => throw new UDFArgumentException(functionNameString + ": requires exactly one argument.")
case _ => {
listInspector = genericInspectors(0) match {
case concreteInspector: ListObjectInspector => concreteInspector
case _ => throw new UDFArgumentException(functionNameString + ": requires an input array.")
}
PrimitiveObjectInspectorFactory.getPrimitiveWritableObjectInspector(listInspector.getListElementObjectInspector.asInstanceOf[PrimitiveObjectInspector].getPrimitiveCategory)
}
}
尽管如此,我的印象是这个函数可以变得更清晰,而且,总的来说,更漂亮,因为我不喜欢有太多缩进级别的代码。
有没有一个惯用的scala方法来改进上面的代码?
1条答案
按热度按时间xwbd5t1u1#
模式通常包含其他模式。类型
x
这是绳子。“任意多个参数”的惯用用法是“序列模式”,它匹配任意参数:
这个答案不应该被解释为提倡匹配您的方式回到类型安全。