Iterazione sui valori Enum in Java

1. Panoramica

Enum in Java è un tipo di dati che ci aiuta ad assegnare un insieme predefinito di costanti a una variabile.

In questo rapido articolo, vedremo diversi modi in cui possiamo iterare su un Enum in Java.

2. Iterazione sui valori enum

Definiamo prima un Enum , in modo da poter creare alcuni semplici esempi di codice:

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

Gli enumeratori non hanno metodi per l'iterazione come forEach () o iterator () . Invece, possiamo usare l'array dei valori Enum restituiti dal metodo values ​​() .

2.1. Ripeti usando for Loop

In primo luogo, possiamo semplicemente usare il ciclo for della vecchia scuola :

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

2.2. Ripeti usando Stream

Possiamo anche usare java.util.Stream . In modo che possiamo eseguire operazioni sui valori Enum .

Per creare uno Stream abbiamo due opzioni, una utilizzando Stream.of :

Stream.of(DaysOfWeekEnum.values());

Un altro, utilizzando Arrays.stream :

Arrays.stream(DaysOfWeekEnum.values());

Quindi, estendiamo la classe DaysOfWeekEnum per creare un esempio utilizzando 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()); } }

Ora scriveremo un esempio per stampare i giorni non lavorativi:

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

L'output che otteniamo quando eseguiamo questo:

SUNDAY SATURDAY

2.3. Ripeti usando forEach ()

Il metodo forEach () è stato aggiunto all'interfaccia Iterable in Java 8. Quindi tutte le classi della raccolta java hanno implementazioni di un metodo forEach () . Per poterli utilizzare con un Enum, dobbiamo prima convertire l'Enum in una raccolta adatta. Possiamo usare Arrays.asList () per generare un ArrayList che possiamo poi girare in loop usando il metodo forEach () :

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

2.4. Ripeti usando EnumSet

EnumSet è un'implementazione di set specializzata che possiamo usare con i tipi Enum :

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

2.5. Utilizzo di un ArrayList di valori Enum

Possiamo anche aggiungere valori di un Enum a un elenco . Questo ci consente di manipolare l' elenco come qualsiasi altro:

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); } 

Possiamo anche creare un ArrayList usando Arrays.asList () .

Tuttavia, poiché ArrayList è supportato dall'array di valori Enum , sarà immutabile, quindi non possiamo aggiungere o rimuovere elementi dall'elenco . La rimozione nel codice seguente avrebbe esito negativo con un'eccezione UnsupportedOperationException :

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

3. Conclusione

Abbiamo visto vari modi per iterare su un Enum usando forEach, Stream e for loop in Java. Se dobbiamo eseguire operazioni parallele, Stream sarebbe una buona opzione.

In caso contrario, non ci sono restrizioni sul metodo da utilizzare.

Come sempre, il codice per tutti gli esempi spiegati qui può essere trovato su GitHub.