Itération sur des valeurs d'énumération en Java

1. Vue d'ensemble

Enum en Java est un type de données qui nous aide à attribuer un ensemble prédéfini de constantes à une variable.

Dans cet article rapide, nous verrons différentes manières dont nous pouvons itérer sur un Enum en Java.

2. Itération sur les valeurs d' énumération

Définissons d'abord un Enum , afin de pouvoir créer des exemples de code simples:

public enum DaysOfWeekEnum { SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY } 

Les énumérations n'ont pas de méthodes d'itération comme forEach () ou iterator () . Au lieu de cela, nous pouvons utiliser le tableau des valeurs Enum renvoyées par la méthode values ​​() .

2.1. Itérer à l'aide de la boucle for

Tout d'abord, nous pouvons simplement utiliser la boucle for old-school :

for (DaysOfWeekEnum day : DaysOfWeekEnum.values()) { System.out.println(day); }

2.2. Itérer à l'aide de Stream

Nous pouvons également utiliser java.util.Stream . Afin que nous puissions effectuer des opérations sur les valeurs Enum .

Pour créer un Stream, nous avons deux options, l'une utilisant Stream.of :

Stream.of(DaysOfWeekEnum.values());

Un autre, en utilisant Arrays.stream :

Arrays.stream(DaysOfWeekEnum.values());

Alors, étendons la classe DaysOfWeekEnum pour créer un exemple en utilisant Stream :

public enum DaysOfWeekEnum { SUNDAY("off"), MONDAY("working"), TUESDAY("working"), WEDNESDAY("working"), THURSDAY("working"), FRIDAY("working"), SATURDAY("off"); private String typeOfDay; DaysOfWeekEnum(String typeOfDay) { this.typeOfDay = typeOfDay; } // standard getters and setters public static Stream stream() { return Stream.Of(DaysOfWeekEnum.values()); } }

Nous allons maintenant écrire un exemple afin d'imprimer les jours non ouvrés:

public class EnumStreamExample { public static void main() { DaysOfWeekEnum.stream() .filter(d -> d.getTypeOfDay().equals("off")) .forEach(System.out::println); } }

La sortie que nous obtenons lorsque nous exécutons ceci:

SUNDAY SATURDAY

2.3. Itérer en utilisant forEach ()

La méthode forEach () a été ajoutée à l' interface Iterable de Java 8. Ainsi, toutes les classes de collection java ont des implémentations d'une méthode forEach () . Pour les utiliser avec un Enum, nous devons d'abord convertir Enum en une collection appropriée. Nous pouvons utiliser Arrays.asList () pour générer un ArrayList que nous pouvons ensuite boucler en utilisant la méthode forEach () :

Arrays.asList(DaysOfWeekEnum.values()) .forEach(day -> System.out.println(day)); 

2.4. Itérer en utilisant EnumSet

EnumSet est une implémentation d'ensemble spécialisée que nous pouvons utiliser avec les types Enum :

EnumSet.allOf(DaysOfWeekEnum.class) .forEach(day -> System.out.println(day));

2.5. Utilisation d'un tableau de valeurs d' énumération

Nous pouvons également ajouter des valeurs d'une énumération à une liste . Cela nous permet de manipuler la liste comme n'importe quel autre:

List days = new ArrayList(); days.add(DaysOfWeekEnum.FRIDAY); days.add(DaysOfWeekEnum.SATURDAY); days.add(DaysOfWeekEnum.SUNDAY); for (DaysOfWeekEnum day : days) { System.out.println(day); } days.remove(DaysOfWeekEnum.SATURDAY); if (!days.contains(DaysOfWeekEnum.SATURDAY)) { System.out.println("Saturday is no longer in the list"); } for (DaysOfWeekEnum day : days) { System.out.println(day); } 

Nous pouvons également créer une ArrayList en utilisant Arrays.asList () .

Cependant, comme ArrayList est sauvegardé par le tableau de valeurs Enum , il sera immuable, nous ne pouvons donc pas ajouter ou supprimer des éléments de la liste. La suppression dans le code suivant échouerait avec une exception UnsupportedOperationException :

List days = Arrays.asList(DaysOfWeekEnum.values()); days.remove(0); 

3. Conclusion

Nous avons vu différentes façons d'itérer sur un Enum en utilisant forEach, Stream et for loop en Java. Si nous devons effectuer des opérations parallèles, Stream serait une bonne option.

Sinon, il n'y a aucune restriction sur la méthode à utiliser.

Comme toujours, le code de tous les exemples expliqués ici se trouve à l'adresse over sur GitHub.