java - 从集合中返回唯一元素的正确方法

标签 java collections set

我有以下几种情况:

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/

相关文章:

java - 如何在机器锁定时模拟用户操作

java - 如何在 Androidx 中更改首选项文本颜色

java - setOnClickListener(新的 OnClickListener(){})

C# - 添加新元素时返回索引的集合

Python:结合使用集合和字典

java - 构建和安装 Apache Atlas 时出错

java - 在 Java 8 中不使用预定义方法将集合转换为另一种集合类型

c# - 将内部字典更新为外部字典中的值

java - 从Java中的数组/集合的每个元素中剥离字符

python - 为什么字典花费的时间比在 python 中设置的时间少?