我需要从给定特定标准的集合中提取许多独特元素。例如。如果我有[(a1,t1,v1),(a2,t2,v2),...,(an,tx,vy)的集合] 我想得到a1,t5,v8。
使用Guava,我可以为每个提供谓词(例如,IsA1实现Predicate ...)然后使用Iterables.find(collection,predicate)来定位每个元素。没关系,但它可能会循环遍历每个谓词的整个集合。
我可以使用Predicates.or(...)将谓词组合成一个并使用Iterables.filter,但是我必须为我需要的每个特定元素搜索结果迭代。
我想要的是一个函数-let称之为“locate” - 它将采用元素集合,谓词列表并生成(谓词 - >元素)的映射
<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>
答案 0 :(得分:2)
番石榴团队成员在这里。执行此操作的首选方法正是您所描述的方式 - 滚动您自己的方法 - 尽管取决于equals
的{{1}}方法存在风险。
我非常有信心,这远不如你所描述的那么普遍,但是,鉴于我们已经pretty stingy用于功能习语。