jeśli masz tablicę typu referencyjnego, najprostszym sposobem jest przekształcenie jej w Listę. Nic nowego tutaj:
MyObject array = ... ;Iterator<MyObject> iterator = Arrays.asList(array).iterator();
trudności pojawiają się, jeśli masz szereg prymitywów. Jeśli masz tablicę int
, przekazanie jej do Arrays.asList()
nie skutkuje List<Integer>
. Zamiast tego dostajesz List<int>
, co prawdopodobnie nie jest tym, czego chcesz!
problem z Iteratorem w tym przypadku polega na tym, że może on iterować tylko nad elementami typu referencyjnego, a nie nad pierwotnymi. Możesz utworzyć Iterator elementów podstawowych z tablicy prymitywnej (przynajmniej z naszego zwykłego trio int
, long
i double
), najpierw zawijając tablicę w strumień, a następnie pobierając Iterator z tej tablicy:
int array = ... ;Iterator<Integer> iterator = Arrays.stream(array).iterator();
możesz używać tego iteratora w zwykły sposób. Należy jednak pamiętać, że każde wywołanie next()
zakończy się boksem prymitywnej wartości, co pociąga za sobą pewne koszty. Jeśli chcesz używać konstrukcji w stylu iteratora, ale uniknąć zbędnych kosztów, możesz użyć nowych prymitywnych iteratorów wprowadzonych w Javie 8. Okazuje się, że Iterator zwracany przez prymitywny strumień, taki jak IntStream
, jest zarówno Iterator<Integer>
, jak i nowym PrimitiveIterator.OfInt
. Ten nowy iterator posiada metodę nextInt()
, która zwraca wartość int
z iteratora bez jej pomijania. Może być stosowany w następujący sposób:
PrimitiveIterator.OfInt intIterator = Arrays.stream(array).iterator();while (intIterator.hasNext()) { methodTakingInt(intIterator.nextInt());}
to samo dotyczy iteratorów long
i double
, które mają analogiczne metody nextLong()
i nextDouble()
.
Konwersja prymitywnych tablic na prymitywne strumienie prawdopodobnie spełnia większość przypadków użycia. Istnieją jednak te alternatywne mechanizmy, które pozwalają na tworzenie długotrwałych konstrukcji w stylu iteratorów, jeśli jest to konieczne.