我看到Hamcrest for Java为执行相同匹配的Iterable
和Collection
定义了一些匹配器。
例如,iterableWithSize()
中的IsIterableWithSize
和hasSize()
中的IsCollectionWithSize
。据我所知,后者是没有必要的,因为任何集合都可以传递给Iterable
版本。
设计API是否有任何技术解释,Iterable
和Collection
是单独处理的?
答案 0 :(得分:1)
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
的实现本身并不遍历所有元素,后者就会快得多。