Поскольку вам нужна еще одна функция для извлечения значения, так что ничего не получится.
В ResultSet следующая() возвращает вас к следующей записи или возвращает false, если ее нет. Затем вы получаете getString(), getInt() или другое, чтобы извлекать значения полей. Так вы пишете код, как:
while (rs.next())
{
name=rs.getString("name"); // or whatever
... do something with name ...
}
В итератор hasNext() возвращает истинное или ложное, чтобы указать, что есть еще одна запись. Затем вы вызываете next() для получения значения. поэтому вы пишете код наподобие:
while (iter.hasnext())
{
name=iter.next(); // or whatever
... do something with name ...
}
Узор заканчивается очень похожим. К сожалению, реализации несовместимы. То есть ResultSet.next не только говорит вам, что вы в конце, но также продвигаете positoin, в то время как Iterator.hasNext говорит вам, что вы в конце, но не продвигаете позицию. Но фактическое использование довольно похоже.
На самом деле это не помогло бы объединить Iterator.hasNext и Iterator.next в одну функцию. Как вы узнаете, когда вы достигнете конца? Вы могли бы сказать, что он возвращает null в конце ... но что, если null является допустимым значением в списке? Я полагаю, вы могли бы добавить какое-то магическое значение, но у вас все еще будет проблема отличия магического значения от записи в списке, которая только что имела это значение. Например, если у вас есть список ints, вы можете сказать, что -1 означает end-of-list, но что тогда, если список включает в себя значение -1?
Единственная альтернатива, которую я вижу, заключается в том, чтобы функция next() возвращала объект, который включает как индикацию конца списка, так и, если применимо, значение. Но это было бы больно использовать. Вам нужно будет написать что-то вроде:
while (true)
{
IterableResult ir=iter.next();
if (ir.end)
{
break;
}
else
{
name=ir.value;
... do something with name ...
}
}
Это, похоже, ничего не дает.
Возможно, есть другой подход, который будет работать лучше, но я не могу думать об этом. И, судя по всему, создатели интерфейса Iterator не могли придумать лучшего способа! :-)
Я пробовал что-то вроде этого while ((o = itr.next())! = Null), я получил NoSuchElementException. Если вы видите реализацию метода iterator next() в разных классах, вы увидите, что исключение NoSuchELementException выбрано путем проверки другого состояния. Например, у Abstractlist есть прекрасный блок catchOptOutOfBoundsException, чтобы вызывать NoSuchElementException и в классе LinkedBlockingDeque следующее: = null check – Delta