[java] Java에서 열거 형을 반복하는 ‘for’루프

나는이 enum추기경 및 중간 길 자바를 :

public enum Direction {
   NORTH,
   NORTHEAST,
   EAST,
   SOUTHEAST,
   SOUTH,
   SOUTHWEST,
   WEST,
   NORTHWEST
}

for이러한 각 enum값 을 반복 하는 루프를 작성하려면 어떻게 해야합니까?



답변

.values()

values()열거 형 에서 메소드를 호출 할 수 있습니다 .

for (Direction dir : Direction.values()) {
  // do what you want
}

values()메소드는 컴파일러에 의해 암시 적으로 선언됩니다 . 따라서 Enum문서에 나열되어 있지 않습니다 .


답변

열거 형의 모든 상수 public static T[] values()는 해당 유형 의 암시 적 메서드를 호출하여 얻을 수 있습니다 .

 for (Direction d : Direction.values()) {
     System.out.println(d);
 }


답변

다음과 같이 할 수 있습니다 :

for (Direction direction : EnumSet.allOf(Direction.class)) {
  // do stuff
}


답변

스트림

Java 8 이전

for (Direction dir : Direction.values()) {
            System.out.println(dir);
}

자바 8

람다와 스트림을 사용할 수도 있습니다 ( Tutorial ).

Stream.of(Direction.values()).forEachOrdered(System.out::println);

왜 스트림을 사용 forEachOrdered하지 forEach않습니까?

의 동작이 forEach명확하게 결정적되는 위치로서 forEachOrdered수행 스트림 정의 발생 순서를 갖는 경우, 스트림의 발생 순서 스트림의 각 요소에 대한 작업. 따라서 forEach주문이 유지된다는 보장은 없습니다.

또한 스트림 (특히 병렬 스트림)으로 작업 할 때 스트림의 특성을 명심하십시오. 당으로 문서 :

스트림 파이프 라인 결과는 스트림 조작에 대한 동작 매개 변수가 상태 저장 인 경우 비 결정적이거나 올바르지 않을 수 있습니다. 상태 저장 람다는 결과는 스트림 파이프 라인 실행 중에 변경 될 수있는 모든 상태에 따라 달라집니다.

Set<Integer> seen = Collections.synchronizedSet(new HashSet<>());
stream.parallel().map(e -> { if (seen.add(e)) return 0; else return e; })...

여기서 매핑 작업이 병렬로 수행되는 경우 스레드 예약 차이로 인해 동일한 입력에 대한 결과가 실행마다 달라질 수 있지만 상태 비 저장 람다 식의 경우 결과는 항상 동일합니다.

스트림 작동에 대한 동작 매개 변수의 부작용은 일반적으로 무단으로 무국적 요구 사항 위반 및 기타 스레드 안전 위험을 초래할 수 있으므로 권장하지 않습니다.

스트림은 정의 된 만남 순서를 갖거나 갖지 않을 수 있습니다. 스트림에 발생 순서가 있는지 여부는 소스 및 중간 작업에 따라 다릅니다.


답변

for(Direction dir : Direction.values())
{

}


답변

주문에 신경 쓰지 않으면 작동합니다.

Set<Direction> directions = EnumSet.allOf(Direction.class);
for(Direction direction : directions) {
    // do stuff
}


답변

    for (Direction  d : Direction.values()) {
       //your code here   
    }