java - 谷歌 Guava : Supported way to get elements of a collection that comply with a given predicate?

标签 java collections functional-programming guava

我需要从给定特定条件的集合中提取许多唯一元素。例如。如果我有一个带有 [ (a1,t1,v1), (a2,t2,v2),...,(an,tx,vy) ] 的集合 我想要 a1、t5、v8。

使用 Guava,我可以为每个元素创建一个谓词(例如 IsA1 实现谓词...),然后使用 Iterables.find(collection, predicate) 来定位每个元素。没关系,但它可能会循环遍历每个谓词的整个集合。

我可以使用 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;
}

有没有一种现成的方法可以做到这一点?我想为了完整性应该有两个版本:

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

最佳答案

这里是 Guava 团队成员。执行此操作的首选方法正是您所描述的方式 - 滚动您自己的方法 - 尽管依赖于 Predicateequals 方法有点冒险。

不过,鉴于我们已经pretty stingy,我非常有信心这种情况远没有您描述的那么常见。关于功能性习语。

关于java - 谷歌 Guava : Supported way to get elements of a collection that comply with a given predicate?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9567921/

相关文章:

java - 如何使用 DynamicJasper API 在 pdf 报告的页脚中显示图像?

java - 面向对象编程。子类的字段

c++ - C++ 中集合/容器的接口(interface)/父类(super class)

functional-programming - 使用条件查询参数构建 URL

jpa - 函数式运算符导致 JPA 崩溃? (漏洞?)

functional-programming - "pure OCaml"是否等同于文献和习惯中的 "purely functional"?

java - 使用 TextIO 读取外部文件

java - 如何检查字符串包含集合中的字符串之一

Java Collection<Generic Type> 没有集合的排序

java - 在 Eclipse Luna 上打开 Java 导入类时找不到源