Google Guava:支持获取符合给定谓词的集合元素的方法吗?

时间:2012-03-05 14:02:50

标签: java collections functional-programming guava

我需要从给定特定标准的集合中提取许多独特元素。例如。如果我有[(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> 

1 个答案:

答案 0 :(得分:2)

番石榴团队成员在这里。执行此操作的首选方法正是您所描述的方式 - 滚动您自己的方法 - 尽管取决于equals的{​​{1}}方法存在风险。

我非常有信心,这远不如你所描述的那么普遍,但是,鉴于我们已经pretty stingy用于功能习语。