2015-12-14 2 views
1

Я вижу, что Hamcrest для Java определяет некоторые совпадения для Iterable s и Collection s, которые выполняют одинаковое совпадение.Повторяющиеся итерационные и коллекционные совпадения с метками

Например, iterableWithSize() в IsIterableWithSize и hasSize() в IsCollectionWithSize. Насколько мне известно, последнее не требуется, поскольку любая коллекция может быть передана в версию Iterable.

Есть ли какое-либо техническое объяснение для разработки API, так что Iterable s и Collection s обрабатываются отдельно?

ответ

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 не сама перебрать все элементы, последний будет много Быстрее.

+0

Итак, это просто для исполнения. Я не понимаю, почему они не подтвердили, что полученный Iterable был экземпляром коллекции! Это было намного чище –

Смежные вопросы