是否有任何常见的 Java 库提供了一种方法来在有限集合中查找元素 并确保只有一个匹配?
例如,如果没有找到任何内容,该方法可以返回 null;如果找到多个元素,则该方法可以抛出异常。
目前,我使用自己的实现(见下文),但我不想用此类实用方法污染业务代码(即使在单独的实用程序包中提取)。
我也不想要多次迭代集合的开销,或者过滤集合和查看结果长度的开销。
附注我当前的解决方案(有效,但要替换为库方法):
public static <T> T getSingleMatch(Iterable<T> lookIn, com.google.common.base.Predicate<? super T> predicate) {
T foundItem = null;
for (T item : lookIn) {
if (predicate.apply(item)) {
if (foundItem != null)
throw new RuntimeException("multiple matches"); // alternatively: `return null;`
else
foundItem = item;
}
}
// alternatively: `if (foundItem == null) throw ...`
return foundItem;
}
最佳答案
一种选择是将这两个想法分成两个方法,以便每个方法只做一件事 - 然后合并调用
- 一种延迟过滤方法,返回一系列匹配结果
- 一种从序列中返回项目的方法,要求它是唯一的项目
Guava两者都有:
-
Iterables.filter
懒惰地过滤 -
Iterables.getOnlyElement
返回序列的唯一元素
例如:
String match = Iterables.getOnlyElement(Iterables.filter(source, predicate));
关于search - Java 库方法在集合中查找项目并检查是否完全匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18397031/