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 团队成员在这里。执行此操作的首选方法正是您描述的方式 - 滚动您自己的方法 - 尽管依赖于 Predicate
的 equals
方法有点冒险。
不过,鉴于我们已经在函数式习语上使用了 pretty stingy,因此我非常有信心这远没有您描述的那么普遍。
【讨论】:
感谢您的验证。我想关于equals
的警告与可以通过它表达的predicate
互换性属性有关。关于 Java 中的 FP,这是一个取其轻的问题。在经典的 Java 中,您可以使用 Comparable
s 的集合来表达这种情况,尽可能多的“if”或类似的方法,我只需要 equals 部分(即不完整的实现)。选项 1 不可维护,选项 2 过度杀伤/不兼容。 Predicate
s 在 LOC 和可读性方面似乎是合理的选择。欢迎提出建议:-)以上是关于Google Guava:支持获取符合给定谓词的集合元素的方法?的主要内容,如果未能解决你的问题,请参考以下文章