Для чего используется интерфейс Iterable?
Вопрос
Я новичок и не могу понять реальный эффект Iterable
интерфейс.
Решение
Помимо того, что сказал Джереми, его главное преимущество заключается в том, что у него есть собственный синтаксический сахар:тот улучшенный цикл for.Если у вас есть, скажем, Iterable<String>
, ты можешь сделать:
for (String str : myIterable) {
...
}
Красиво и легко, не так ли?Вся грязная работа по созданию Iterator<String>
, проверяю, так ли это hasNext()
, и звоню str = getNext()
обрабатывается компилятором за кулисами.
И поскольку большинство коллекций либо реализуют Iterable
или иметь представление, которое возвращает его (например, Map
's keySet()
или values()
), это значительно упрощает работу с коллекциями.
В Iterable
Javadoc дает полный список классов, реализующих Iterable
.
Другие советы
Если у вас сложный набор данных, например дерево или спиральная очередь (да, я только что это придумал), но вы плевать как это структурировано внутри: вы просто хотите получить все элементы один за другим, вы получаете возврат итератора.
Рассматриваемый сложный объект, будь то дерево, очередь или WombleBasket, реализует Iterable и может возвращать объект итератора, который вы можете запросить с помощью методов Iterator.
Таким образом, вы можете просто спросить его, если это hasNext()
, и если это так, вы получите next()
предмет, не беспокоясь о том, где его взять с дерева или где-то еще.
Он возвращает java.util.Iterator
.В основном он используется для возможности использования типа реализации в расширенном цикле for.
List<Item> list = ...
for (Item i:list) {
// use i
}
Под капотом компилятор вызывает list.iterator()
и повторяет его, давая вам i
внутри цикла for.
Интерфейс по своей сути представляет собой список методов, которые должен реализовать класс.Итерируемый интерфейс очень прост — можно реализовать только один метод: Iterator()
.Когда класс реализует Iterable
интерфейс, он сообщает другим классам, что вы можете получить Iterator
объект, который будет использоваться для перебора (т. е. обхода) данных в объекте.
Итераторы в основном позволяют выполнять итерацию по любой коллекции.
Это также то, что необходимо для использования оператора управления Java for-each.