Porque todavía necesitaría otra función para recuperar el valor, por lo que no se ganaría nada.
En un ResultSet, next() lo lleva al siguiente registro, o devuelve falso si no hay ninguno. Luego obtiene getString() 's, getInt()' s o lo que sea para recuperar valores de campo. Así se escribe código como:
while (rs.next())
{
name=rs.getString("name"); // or whatever
... do something with name ...
}
En un iterador, hasNext() devuelve un verdadero o falso para indicar si hay otro registro. Luego llama a next() para recuperar el valor. para que escriba código como:
while (iter.hasnext())
{
name=iter.next(); // or whatever
... do something with name ...
}
El patrón termina siendo bastante similar. Es desafortunado que las implementaciones sean inconsistentes. Es decir, ResultSet.next no solo te dice si estás al final sino que también avanza la posición posterior, mientras que Iterator.hasNext te dice si estás al final pero no avanza la posición. Pero el uso real es bastante similar.
Realmente no funcionaría tratar de combinar Iterator.hasNext y Iterator.next en una sola función. ¿Cómo sabrías cuándo alcanzaste el final? Podría decir que devuelve nulo al final ... pero ¿qué ocurre si null es un valor válido en la lista? Supongo que podría agregar algún valor mágico, pero aún tendría el problema de distinguir el significado mágico de una entrada en la lista que acaba de tener ese valor. Al igual que si tiene una lista de entradas, podría decir que -1 significa final de lista, pero ¿qué ocurre si la lista incluye un valor de -1?
La única otra alternativa que veo es hacer que la función next() devuelva un objeto que incluye tanto una indicación de fin de lista como, si corresponde, el valor. Pero esto sería un dolor de usar. Tendría que escribir algo como:
while (true)
{
IterableResult ir=iter.next();
if (ir.end)
{
break;
}
else
{
name=ir.value;
... do something with name ...
}
}
Eso no parece ganar nada.
Quizás haya otro enfoque que funcionaría mejor, pero no puedo pensar en uno. ¡Y aparentemente los creadores de la interfaz Iterator tampoco pudieron pensar en una mejor manera! :-)
Intenté algo así mientras ((o = itr.next())! = Null), obtuve NoSuchElementException. Si ve la implementación del método iterator next() en varias clases, verá NoSuchELementException arrojando una condición diferente. Por ejemplo, Abstractlist tiene un hermoso bloque catch de IndexOutOfBoundsException para lanzar NoSuchElementException y en la clase LinkedBlockingDeque tenemos next! = Null check – Delta