Jak mogę zamienić tablicę w Iterator?

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.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.