2016-06-05 2 views
1

Я пишу 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 для улучшения кода выше?

+0

1) 'initialize' в настоящее время принимает массив' ObjectInspector' (вместо 'DeferredObject'. 2) Что такое' ListObjectInspector' 'ObjectInspector'? Подтип? 3) Вы можете бросить меньше исключений и принять более функциональный стиль? – Jubobs

+0

'case Array() | Массив (_, _, _ *) 'можно было бы выгодно заменить на' case _, если genericInspectors.length! = 1'. – Jubobs

+0

@Jubobs 1) Исправлено :) 2) 'ListObjectInspector' реализует интерфейс' ObjectsInspector' 3) Я определенно хочу быть более «функциональным», но исключения - это способ передачи информации пользователю, который выполняет функцию в Hive – gire

ответ

0

Это типично для узоров, которые включают другие узоры. Тип x здесь - String.

scala> val xs: Array[Any] = Array("x") 
xs: Array[Any] = Array(x) 

scala> xs match { 
    | case null => ??? 
    | case Array(x: String) => x 
    | case _ => ??? 
    | } 
res0: String = x 

идиом для «любого числа аргументов» является «моделью последовательности», которая соответствует произвольной арг:

scala> val xs: Array[Any] = Array("x") 
xs: Array[Any] = Array(x) 

scala> xs match { case Array(x: String) => x case Array(_*) => ??? } 
res2: String = x 

scala> val xs: Array[Any] = Array(42) 
xs: Array[Any] = Array(42) 

scala> xs match { case Array(x: String) => x case Array(_*) => ??? } 
scala.NotImplementedError: an implementation is missing 
    at scala.Predef$.$qmark$qmark$qmark(Predef.scala:230) 
    ... 32 elided 

scala> Array("x","y") match { case Array(x: String) => x case Array(_*) => ??? } 
scala.NotImplementedError: an implementation is missing 
    at scala.Predef$.$qmark$qmark$qmark(Predef.scala:230) 
    ... 32 elided 

Этого ответ не должен быть истолкован как пропаганда соответствия своего пути обратно к типу безопасности.

+0

Сколько вложенных шаблонов слишком много? – gire

Смежные вопросы