2013-03-11 51 views
0

當properties.keySet包含不在EXPECTED_IMPORT_KEYS中的鍵時,此代碼將引發異常。 VAL在代碼中被引用三次,如何消除此Scala分配/測試/拋出序列中的val重複

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

在Scala中是否有一些更優雅的方法來實現這一點?我特別想到重複的val引用。這些重複可以消除嗎?

它可能有助於知道在代碼完成後不需要意外鍵值。

我期待的改進是從val發生的次數減少三次。沒有必要有一個val,這只是我的初始表述。

回答

3

你可以嘗試:

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

「匹配」確實發生在我身上,但我無法改進這裏提供的例子,其中提到了三次殘差。 – 2013-03-11 23:05:38

+3

一旦命名它,一次檢查它是否爲空,並且一次拋出它......我懷疑你會做得更好。 – 2013-03-11 23:06:47

+1

我會說改善至少是沒有不必要的'val'(unexpectedKeys)定義的事實。值'residual'僅在匹配範圍內定義。 – 2013-03-15 19:58:17

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)