Почему стандартный итератор Java не имеет функции peek ()?
Поскольку peek()
не является основной функцией шаблона проектирования Iterator.
Поскольку подавляющее большинство сценариев использования итераторов не требует этого. Заставлять все реализации (включая множество пользовательских / сторонних классов) реализовывать ненужный метод было бы плохой идеей.
Поскольку метод peek()
имеет потенциальное влияние на семантику для итераторов ленивых ... источников.
Поскольку реализация peek()
влияет на эффективность (память, ЦП) итератора в некоторых обстоятельствах. Используете ли вы его на самом деле или нет.
Поскольку peek()
в некоторых неясных обстоятельствах приведет к утечке памяти.
Потому что ... ПОЦЕЛУЙ.
Но, в конечном счете, настоящая причина в том ... потому что они разработали его еще в 2000 году. И нас не было в комнате, когда проходили дизайнерские дебаты 1 .
1 - кажется, что большинство 2 других языков приняли такое же решение для своего стандартного API итератора. Ржавчина, кажется, является исключением из этого; см. https://doc.rust -lang.org / std / iter / struct.Peekable.html .
2 - ... на основе крайне ненаучного "опроса" с использованием поиска Google.
Если вам нужна абстракция итератора, которая также предоставляет peek()
, вы можете расширить интерфейс Iterator
и реализовать итераторы для себя. Действительно, итератор общего назначения общего назначения может быть легко реализован как оболочка для обычного Iterator
.
Или искать сторонний API / реализацию (и); например Гуава , Apache Commons и т. Д.