Ponieważ nadal potrzebna jest inna funkcja do pobrania wartości, więc nic nie zostanie uzyskane.
W ResultSet, next() przeniesie Cię do następnego rekordu lub zwróci false, jeśli nie ma żadnego. Następnie uzyskujesz wartości getString(), getInt() lub cokolwiek, aby pobrać wartości pól. Tak jak piszesz kod:
while (rs.next())
{
name=rs.getString("name"); // or whatever
... do something with name ...
}
W iterator, hasNext() zwraca true lub false, aby wskazać, czy istnieje inny rekord. Następnie wywołaj next(), aby pobrać wartość. tak jak piszesz kod:
while (iter.hasnext())
{
name=iter.next(); // or whatever
... do something with name ...
}
Wzorzec kończy się dość podobnie. To niefortunne, że implementacje są niespójne. Oznacza to, że ResultSet.next nie tylko informuje, czy jesteś na końcu, ale także zwiększa positoin, podczas gdy Iterator.hasNext mówi ci, czy jesteś na końcu, ale nie przesuwasz pozycji. Ale faktyczne użycie jest podobne.
Naprawdę nie działałoby, aby połączyć Iterator.hasNext i Iterator.next w jedną funkcję. Skąd wiesz, kiedy dotarłeś do końca? Można powiedzieć, że na koniec zwraca wartość null ... ale co jeśli null jest poprawną wartością na liście? Przypuszczam, że mógłbyś dodać trochę magicznej wartości, ale nadal masz problem z odróżnieniem magicznego znaczenia od wpisu na liście, który akurat miał taką wartość. Jeśli masz listę int, możesz powiedzieć, że -1 oznacza koniec listy, ale co jeśli lista zawiera wartość -1?
Jedyną alternatywą jaką widzę, to funkcja next() zwraca obiekt, który zawiera zarówno wskazanie końca listy, jak i, jeśli ma to zastosowanie, wartość. Ale byłby to trudny do użycia. Będziesz musiał napisać coś w stylu:
while (true)
{
IterableResult ir=iter.next();
if (ir.end)
{
break;
}
else
{
name=ir.value;
... do something with name ...
}
}
Wydaje się, że nic nie zyskuje.
Może istnieje inne podejście, które działałoby lepiej, ale nie mogę o nim myśleć. I najwyraźniej twórcy interfejsu Iteratora również nie mogli wymyślić lepszego sposobu! :-)
Próbowałem czegoś takiego podczas ((o = itr.next())! = Null), dostałem NoSuchElementException. Jeśli zobaczysz implementację metody iterator next() w różnych klasach, zobaczysz wyjątek NoSuchELementException, sprawdzając inny warunek. Na przykład, Lista statystyk ma piękny blok catch obiektu IndexOutOfBoundsException, aby rzucić wyjątek NoSuchElementException, a w klasie LinkedBlockingDeque mamy następną! = Zerowa kontrola – Delta