Итератор - это своего рода курсор, который можно перемещать по элементам любой коллекции элементов. Таким образом, его внутреннее состояние является главным образом указателем на текущий элемент. Если вы попытаетесь выяснить, содержит ли он «определенный элемент», вам придется перемещать курсор и, следовательно, изменять внутреннее состояние. Изменение состояния, просто задавая вопрос, конечно, плохо.
Это даже проблема с упомянутым Гуава. Он изменит объект итератора, просто вызов метод contains.
Итерабельность, с другой стороны, представляет собой просто интерфейс, сообщающий компилятору, что есть что-то, чтобы перебрать. В большинстве случаев итерируемый объект будет самой коллекцией. Если вы добавите такие методы, как «contains» в интерфейс Iterable, вы получите (упрощенную) версию интерфейса Collection, которая уже существует. Поэтому в этом нет необходимости.
Если вы застряли в своем коде в каком-либо месте, где у вас есть ссылка на итерируемую, но вам нужна функциональность коллекции, вы должны подумать о реорганизации своего кода. Либо вы должны последовательно использовать коллекцию интерфейсов, либо спросить себя, почему вам лучше не обращаться к методам сбора на данный момент. Таким образом, ваша проблема, скорее всего, является результатом субоптимального кода.
С другой стороны, я бы счел странным, что использовать Iterable как тип для параметров или переменных в любом случае. Технически вы можете это сделать, но я думаю, что он предназначен только для петель.
Если вы ограничены в библиотеках JDK, я не верьте, что есть прямые средства для этого. –