2

是否有任何常见的 Java 库提供了一种在有限集合中查找元素 确保完全匹配的方法?

例如,该方法可以null在没有找到任何内容时返回,如果找到多个元素则抛出异常。

目前我使用自己的实现(见下文),但我宁愿不使用此类实用程序方法污染业务代码(即使提取在单独的实用程序包中)。

也不希望多次迭代集合的开销,或者过滤集合和查看结果长度的开销。

PS我当前的解决方案(有效,但将被库方法替换):

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;
}
4

2 回答 2

3

一种选择是将两个想法分离成两个方法,以便每个方法做一件事 - 然后组合调用

  • 一种懒惰过滤的方法,返回一系列匹配结果
  • 从序列中返回项目的一种方法,要求它是唯一的项目

番石榴有这两个:

例如:

String match = Iterables.getOnlyElement(Iterables.filter(source, predicate));
于 2013-08-23T07:21:17.203 回答
2
int index = collection.indexOf(item);
if (index != -1 && index == collection.lastIndexOf(item)) {
    // one and only one
}

如果index != -1它意味着没有这样的项目。如果下一个 if 语句的计算结果不为 true,则意味着至少有 2 个项目。您可以对其进行重组以引发异常、返回 null 或返回索引或项。我相信您知道如何根据您的问题执行此操作。

于 2013-08-23T07:19:05.587 回答