2012-04-03 82 views
5

如果只有一個元素存在於集合中,最近我需要做'特殊情況'情形。檢查...size() == 1,並通過使用...iterator.next()檢索看着醜陋的家釀集合類,所以我創建了兩個方法:檢查使用番石榴是否僅存在一個元素

public class Collections { 
    public static <T> boolean isSingleValue(Collection<T> values) { 
     return values.size() == 1; 
    } 

    public static <T> T singleValue(Collection<T> values) { 
     Assert.isTrue(isSingleValue(values)); 
     return values.iterator().next(); 
    } 
} 

前幾天我發現,番石榴方法稱爲Iterables.getOnlyElement。它涵蓋了我的需求,並取代singleValue,但我無法找到匹配isSingleValue。這是由設計嗎? Iterables.isOnlyElement方法是否值得放入功能請求?

編輯: 因爲有幾個upvotes,我決定打開番石榴增強 - issue 957。最終決議 - 'WontFix'。參數與Thomas/Xaerxess提供的參數非常相似。

回答

10

那麼,用一種方法替換values.size() == 1,你不會獲得太多收益,除非你可以檢查null。但是,在Apache Commons Collections(以及我認爲的Guava)中有這樣的方法。

我寧願寫if(values.size() == 1)if(SomeHelper.size(values) == 1)
if(SomeHelper.isSingleValue(values)) - 目的是前兩種方法更清晰,這是儘可能多的代碼編寫,因爲用第三種方法。

6

只是除了其他答案(我會寫類似@daveb誰刪除了他的一個:如果有一個元素是不完全的,那麼Iterables#getOnlyElement將拋出一個IllegalArgumentExceptionNoSuchElementException) - 回答質疑爲什麼Guava中沒有任何Iterables.isSingleValue(Iterable)

我認爲你犯了這個錯誤。如果:

  • 方法invokation不改變狀態(不同於迭代next(),這就是爲什麼hasNext()存在)
  • ,你可以清楚地和exlicitly說返回的值不是特殊情況(不像nullMap#get(Object)返回 - 它可以是空值,也可以是指鑰匙未在地圖中找到)

沒有必要方法檢查,如果條件爲真,然後在其中做一些操作(與斷言)像!你的示例代碼。

如果你確定這個地方的迭代器的大小不能大於1,那麼條件檢查是多餘的(在其他情況下拋出異常)。
如果您只想獲得非空集合中的第一個元素 - collection.iterator.next()完全可以(如果集合爲空,則會拋出NoSuchElementException)。
如果你不知道任何有關收藏的尺寸,Iterables.getFirst(iterable, default)都適合你。

P.S.如果您的Collections#isSingleValue僅在本地使用(因此可能是私人的),那麼真的意味着您在致電Iterables#getOnlyValue之前不需要檢查。

P.P.S.另一個關於番石榴的設計問題的答案可能是Joshua Bloch的項目57 有效的Java - 我之前提到的Guava中很少有不同的幫助方法,明確說明每種方法的特例;因爲保持API儘可能小,所以不添加布爾檢查。

0

現在我有同樣的問題。

我會用這個代碼來解決:

public static <T> void hasJustOne(T... values) { 
    hasJustOne(Predicates.notNull(), values); 
} 

public static <T> void hasJustOne(Predicate<T> predicate, T... values) { 
    Collection<T> filtred = Collections2.filter(Arrays.asList(values),predicate); 
    Preconditions.checkArgument(filtred.size() == 1); 
} 
+0

這是不明確的,什麼是「我會解決」是什麼意思?你是說這是一個解決方案,還是你正在解決這個問題? – 2014-02-27 07:24:41

+0

這是我的解決方案。 – Falci 2014-02-28 13:21:51