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

Posted

技术标签:

【中文标题】Google Guava:支持获取符合给定谓词的集合元素的方法?【英文标题】:Google Guava: Supported way to get elements of a collection that comply with a given predicate? 【发布时间】:2012-03-23 00:00:05 【问题描述】:

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

使用 Guava,我可以为每个元素设置一个 Predicate(例如 IsA1 实现 Predicate ...),然后使用 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> 

【问题讨论】:

【参考方案1】:

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

不过,鉴于我们已经在函数式习语上使用了 pretty stingy,因此我非常有信心这远没有您描述的那么普遍。

【讨论】:

感谢您的验证。我想关于equals 的警告与可以通过它表达的predicate 互换性属性有关。关于 Java 中的 FP,这是一个取其轻的问题。在经典的 Java 中,您可以使用 Comparables 的集合来表达这种情况,尽可能多的“if”或类似的方法,我只需要 equals 部分(即不完整的实现)。选项 1 不可维护,选项 2 过度杀伤/不兼容。 Predicates 在 LOC 和可读性方面似乎是合理的选择。欢迎提出建议:-)

以上是关于Google Guava:支持获取符合给定谓词的集合元素的方法?的主要内容,如果未能解决你的问题,请参考以下文章

使用google guava做内存缓存

Java内存缓存-通过Google Guava创建缓存

[Google Guava]字符串处理:连接器拆分器字符匹配器

google Guava 快速入门

Google Guava官方教程

Entity Framework LINQ 复杂查询 - 组合多个谓词