我有以下几种情况:
Set<Element> set = getSetFromSomewhere();
if (set.size() == 1) {
// return the only element
} else {
throw new Exception("Something is not right..");
}
假设我无法更改 getSetFromSomewhere()
的返回类型,是否有更好或更正确的方法来返回集合中唯一的元素而不是
- 遍历集合并立即返回
- 从集合中创建一个列表并调用
.get(0)
最佳答案
您可以使用 Iterator
来获取唯一的元素以及验证集合是否仅包含一个元素(从而避免 size()
调用和不必要的列表创建):
Iterator<Element> iterator = set.iterator();
if (!iterator.hasNext()) {
throw new RuntimeException("Collection is empty");
}
Element element = iterator.next();
if (iterator.hasNext()) {
throw new RuntimeException("Collection contains more than one item");
}
return element;
您通常会将其包装在自己的方法中:
public static <E> E getOnlyElement(Iterable<E> iterable) {
Iterator<E> iterator = iterable.iterator();
// The code I mentioned above...
}
请注意,此实现已经是 Google 的 Guava libraries 的一部分。 (我强烈推荐,即使您不将它用于此特定代码)。更具体地说,该方法属于 Iterables
class :
Element element = Iterables.getOnlyElement(set);
如果您对它的实现方式感到好奇,可以查看 Iterators
class source code (Iterables
中的方法经常调用Iterators
中的方法):
/**
* Returns the single element contained in {@code iterator}.
*
* @throws NoSuchElementException if the iterator is empty
* @throws IllegalArgumentException if the iterator contains multiple
* elements. The state of the iterator is unspecified.
*/
public static <T> T getOnlyElement(Iterator<T> iterator) {
T first = iterator.next();
if (!iterator.hasNext()) {
return first;
}
StringBuilder sb = new StringBuilder();
sb.append("expected one element but was: <" + first);
for (int i = 0; i < 4 && iterator.hasNext(); i++) {
sb.append(", " + iterator.next());
}
if (iterator.hasNext()) {
sb.append(", ...");
}
sb.append('>');
throw new IllegalArgumentException(sb.toString());
}
关于java - 从集合中返回唯一元素的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5229137/