Я пишу UUF Hive в Scala (потому что я хочу изучить scala). Для этого мне необходимо переопределить три функции: evaluate
, initialize
и getDisplayString
.Scala: Как упростить вложенные утверждения соответствия шаблонов
В функции инициализации я должен:
- Получить массив
ObjectInspector
и вернутьObjectInspector
- Проверьте, если массив пустой
- Проверьте, если массив имеет правильный размер
- Проверьте, содержит ли массив нужный объект
Для этого I Я использую сопоставления с образцом и придумал следующую функцию:
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) 'initialize' в настоящее время принимает массив' ObjectInspector' (вместо 'DeferredObject'. 2) Что такое' ListObjectInspector' 'ObjectInspector'? Подтип? 3) Вы можете бросить меньше исключений и принять более функциональный стиль? – Jubobs
'case Array() | Массив (_, _, _ *) 'можно было бы выгодно заменить на' case _, если genericInspectors.length! = 1'. – Jubobs
@Jubobs 1) Исправлено :) 2) 'ListObjectInspector' реализует интерфейс' ObjectsInspector' 3) Я определенно хочу быть более «функциональным», но исключения - это способ передачи информации пользователю, который выполняет функцию в Hive – gire