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