Iterando Valores Enum em Java
1. Visão geral
Enum em Java é um tipo de dados que nos ajuda a atribuir um conjunto predefinido de constantes a uma variável.
Neste artigo rápido, veremos diferentes maneiras de iterar em umEnum em Java.
2. Iterando sobre os valores deEnum
Vamos primeiro definir umEnum, para que possamos criar alguns exemplos de código simples:
public enum DaysOfWeekEnum {
SUNDAY,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
}
Enums não possuem métodos para iteração comoforEach() ouiterator(). Em vez disso, podemos usar a matriz dos valoresEnum retornados pelo métodovalues().
2.1. Iterar usando o for Loop
Em primeiro lugar, podemos simplesmente usar o loopfor da velha escola:
for (DaysOfWeekEnum day : DaysOfWeekEnum.values()) {
System.out.println(day);
}
2.2. Iterar usandoStream
Também podemos usarjava.util.Stream. Para que possamos realizar operações nos valores deEnum.
Para criar umStream, temos duas opções, uma usandoStream.of:
Stream.of(DaysOfWeekEnum.values());
Outro, usandoArrays.stream:
Arrays.stream(DaysOfWeekEnum.values());
Então, vamos estender a classeDaysOfWeekEnum para criar um exemplo usandoStream:
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());
}
}
Agora vamos escrever um exemplo para imprimir os dias não úteis:
public class EnumStreamExample {
public static void main() {
DaysOfWeekEnum.stream()
.filter(d -> d.getTypeOfDay().equals("off"))
.forEach(System.out::println);
}
}
A saída que obtemos quando executamos isso:
SUNDAY
SATURDAY
2.3. Iterar usandoforEach()
O métodoforEach() foi adicionado à interfaceIterable no Java 8. Portanto, todas as classes de coleção java têm implementações de um métodoforEach(). Para usá-los com um Enum, primeiro precisamos converter o Enum em uma coleção adequada. Podemos usarArrays.asList() para gerar umArrayList que podemos então repetir usando o métodoforEach():
Arrays.asList(DaysOfWeekEnum.values())
.forEach(day -> System.out.println(day));
2.4. Iterar usandoEnumSet
EnumSet é uma implementação de conjunto especializada que podemos usar com os tiposEnum:
EnumSet.allOf(DaysOfWeekEnum.class)
.forEach(day -> System.out.println(day));
2.5. Usando umArrayList de valoresEnum
Também podemos adicionar valores de umEnum a umList. Isso nos permite manipularList como qualquer outro:
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);
}
Também podemos criar umArrayList usandoArrays.asList().
No entanto, comoArrayList é apoiado pela matriz de valoresEnum, ele será imutável, portanto, não podemos adicionar ou remover itens deList.. A remoção no código a seguir iria falhar com anUnsupportedOperationException:
List days = Arrays.asList(DaysOfWeekEnum.values());
days.remove(0);
3. Conclusão
Vimos várias maneiras de iterar em umEnum usandoforEach,Streame loopfor em Java. Se precisarmos realizar qualquer operação paralela,Stream seria uma boa opção.
Caso contrário, não há nenhuma restrição sobre qual método usar.
Como sempre, o código para todos os exemplos explicados aqui pode ser encontradoover on GitHub.