Comment puis-je transformer un tableau en Itérateur ?

Si vous avez un tableau de type de référence, le plus simple est de le transformer en liste. Rien de nouveau ici:

MyObject array = ... ;Iterator<MyObject> iterator = Arrays.asList(array).iterator();

Des difficultés surviennent si vous avez un tableau de primitives. Si vous avez un tableau int, le passer à Arrays.asList() n’entraîne pas un List<Integer>. Au lieu de cela, vous obtenez un List<int>, ce qui n’est probablement pas ce que vous voulez!

Le problème avec l’Itérateur dans ce cas est qu’il ne peut itérer que sur des éléments de type référence, pas sur des primitives. Vous pouvez créer un Itérateur de primitives en boîte à partir d’un tableau primitif (au moins à partir de notre trio habituel de int, long et double) en enveloppant d’abord le tableau dans un flux, puis en obtenant un Itérateur à partir de celui-ci:

int array = ... ;Iterator<Integer> iterator = Arrays.stream(array).iterator();

Vous pouvez utiliser cet Itérateur de la manière habituelle. Notez cependant que chaque appel à next() finira par boxer la valeur primitive, ce qui entraîne une surcharge. Si vous souhaitez utiliser des constructions de style Itérateur mais éviter les frais généraux de boxe, vous pouvez utiliser les nouveaux itérateurs primitifs introduits dans Java 8. Il s’avère que l’Itérateur renvoyé par un flux primitif tel que IntStream est à la fois un Iterator<Integer> et le nouveau PrimitiveIterator.OfInt. Ce nouvel itérateur a une méthode nextInt() qui renvoie la valeur int de l’Itérateur sans la boxer. Il peut être utilisé comme suit:

PrimitiveIterator.OfInt intIterator = Arrays.stream(array).iterator();while (intIterator.hasNext()) { methodTakingInt(intIterator.nextInt());}

Il en va de même pour les itérateurs long et double, qui ont des méthodes analogues nextLong() et nextDouble().

La conversion de tableaux primitifs en flux primitifs satisfait probablement la plupart des cas d’utilisation. Cependant, ces mécanismes alternatifs existent qui vous permettent de créer des constructions de style Itérateur de longue date si elles sont nécessaires.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.