Itération sur les valeurs Enum en Java

Itérer sur des valeurs énormes en Java

1. Vue d'ensemble

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

Dans cet article rapide, nous verrons différentes façons dont nous pouvons parcourir unEnum en Java.

2. Itération sur les valeursEnum

Définissons d'abord unEnum, afin que nous puissions créer quelques 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 commeforEach() ouiterator(). Au lieu de cela, nous pouvons utiliser le tableau des valeursEnum renvoyées par la méthodevalues().

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

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

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

2.2. Itérer en utilisantStream

Nous pouvons également utiliserjava.util.Stream. Pour que nous puissions effectuer des opérations sur les valeursEnum.

Pour créer unStream, nous avons deux options, l'une utilisantStream.of:

Stream.of(DaysOfWeekEnum.values());

Un autre, en utilisantArrays.stream:

Arrays.stream(DaysOfWeekEnum.values());

Alors, étendons la classeDaysOfWeekEnum pour créer un exemple en utilisantStream:

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 pour imprimer les jours non ouvrables:

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 courons ceci:

SUNDAY
SATURDAY

2.3. Itérer en utilisantforEach()

La méthodeforEach() a été ajoutée à l'interfaceIterable dans Java 8. Ainsi, toutes les classes de collection java ont des implémentations d'une méthodeforEach(). Afin de les utiliser avec un Enum, nous devons d’abord convertir l’Enum en une collection appropriée. Nous pouvons utiliserArrays.asList() pour générer unArrayList que nous pouvons ensuite boucler en utilisant la méthodeforEach():

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

2.4. Itérer en utilisantEnumSet

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

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

2.5. Utilisation d'unArrayList des valeursEnum

Nous pouvons également ajouter des valeurs d'unEnum à unList. Cela nous permet de manipuler lesList 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 unArrayList en utilisantArrays.asList().

Cependant, comme leArrayList est sauvegardé par le tableau de valeursEnum, il sera immuable, donc nous ne pouvons pas ajouter ou supprimer des éléments desList. La suppression dans le code suivant échouerait avec unUnsupportedOperationException:

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

3. Conclusion

Nous avons vu différentes façons d'itérer sur une boucleEnum en utilisantforEach,Stream et la bouclefor 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 peut être trouvéover on GitHub.