2012-03-05 44 views
1

我需要從給定一定標準的集合中提取許多獨特的元素。例如。 (a1,t1,v1),(a2,t2,v2),...,(an,tx,vy)] 我想得到a1,t5,v8。使用番石榴,我可以爲每個(例如,IsA1實現謂詞...),然後使用Iterables.find(集合,謂詞)來定位每個元素。沒關係,但它可能會循環每個謂詞的整個集合。Google Guava:支持獲取符合給定謂詞的集合的元素的方法?

我可以將謂詞組合成一個使用Predicates.or(...)並使用Iterables.filter,但是我將不得不搜索我需要的每個特定元素的結果迭代。

我想什麼已經是一個功能 - 讓我們把它稱爲「定位」 - 這將採取元素集合,謂詞的列表,併產生地圖(謂語 - >元素)

<T> Map<Predicate<? super T>, T> locate(Collection<T>, Collection<Predicate<? super T>) 

我已經推出了自己的產品,因爲我無法找到它,但這是一個很普遍的情況,我認爲我還沒有找到它。

我的參考版本:

public static <T> Map<Predicate<? super T>,T> locateUnique(Iterable<T> col, Collection<Predicate<? super T>> predicates) { 
    HashMap<Predicate<? super T>, T> result = Maps.newHashMap(); 
     for (T t:col) { 
      for (Predicate<? super T> p:predicates) { 
       if (p.apply(t)){ 
        result.put(p, t); 
       } 
      } 
     } 
    return result; 
} 

有沒有做這外的即裝即用的方式?我想應該有2個版本的完整性:

locateUnique(...) -> Map<Predicate,T> 
locate(...) -> MultiMap<Predicat,T> 

回答

2

番石榴團隊成員在這裏。執行此操作的首選方式與您所描述的方式完全相同 - 滾動您自己的方法 - 儘管取決於Predicateequals方法有點冒險。

我非常有信心,這是遠不像您所描述的情況下常見的案件,但鑑於我們已經在功能成語pretty stingy

+0

感謝您的驗證。我猜關於'equals'的警告與可以通過它表達的'predicate'互換性屬性有關。關於Java中的FP,這只是所有惡意中較小的一個問題。在一個經典的Java中,你可以用很多「if」或類似的方法來表示這種情況,使用「Comparable」集合,我只需要equals部分(即不完整實現)。選項1是不可維護的,選項2是矯枉過正/不合規。就LOC和可讀性而言,謂詞似乎是合理的選擇。建議歡迎:-) – maasg 2012-03-06 12:25:22