复制 Iterable 和 Collection Hamcrest 匹配器

Duplicate Iterable and Collection Hamcrest matchers

我看到 Java 的 Hamcrest 为 IterableCollection 定义了一些执行相同匹配的匹配器。

例如,IsIterableWithSize 中的 iterableWithSize()IsCollectionWithSize 中的 hasSize()。据我所知,后者不是必需的,因为任何集合都可以传递给 Iterable 版本。

是否有任何技术解释来设计 API 以便 IterableCollection 分开处理?

Collection 接口包含一些方法,这些方法可以加快某些匹配器的速度,否则这些匹配器将需要遍历所有元素。

您提供的示例就是这样一种方法。比较两种确定实际值大小的方法:

protected Integer featureValueOf(Iterable<E> actual) {
  int size = 0;
  for (Iterator<E> iterator = actual.iterator(); iterator.hasNext(); iterator.next()) {
    size++;
  }
  return size;
}

对比

protected Integer featureValueOf(Collection<? extends E> actual) {
  return actual.size();
}

只要 size 的实现本身不遍历所有元素,后者会快得多。