2013-03-11 5 views
0

Этот код генерирует исключение, когда properties.keySet содержит ключи, отсутствующие в EXPECTED_IMPORT_KEYS. Значение val имеет три значения в коде,Как исключить повторение val в этой задаче Scala/test/throw

val unexpectedKeys = properties.keySet -- EXPECTED_IMPORT_KEYS 
if (unexpectedKeys.nonEmpty) { 
    throw new UnexpectedKeysException(unexpectedKeys) 
} 

Есть ли еще более элегантный способ достичь этого в Scala? Я имею в виду, в частности, повторные ссылки val. Могут ли эти повторения быть устранены?

Это может помочь узнать, что неожиданный ключ Keys не требуется после завершения кода.

Улучшение, которое я ищу, - это сокращение от трех в количестве раз, когда происходит вал. Нет необходимости иметь вал, это только моя первоначальная формулировка.

ответ

3

Вы можете попробовать:

(properties.keySet -- EXPECTED_IMPORT_KEY) match { 
    case residual if residual.nonEmpty => throw new UnexpectedKeysException(residual) 
    case _ => 
} 
+0

"матч" это произошло со мной, но я не смог улучшить пример, приведенный здесь, где упоминание остаточного упоминания трижды. –

+3

Как-то раз, чтобы проверить, пуст ли он, и один раз бросить его ... я сомневаюсь, что вы сделаете гораздо лучше. –

+1

Я бы сказал, что улучшение - это, по крайней мере, тот факт, что не существует лишних «val» (неожиданных ключей). Значение 'остаточный' определяется только в области соответствия. –

4

Если вам это нужно часто просто определить небольшой вспомогательный метод:

def emptyOption[A, CC <: Iterable[A]](coll: B with collection.IterableLike[A, CC]) = 
    if (coll.isEmpty) None else Some(coll) 

Затем использовать его как это:

scala> emptyOption(Set[Int]()) foreach (coll => throw new RuntimeException(coll.toString)) 

scala> emptyOption(Set[Int](1)) foreach (coll => throw new RuntimeException(coll.toString)) 
java.lang.RuntimeException: Set(1)