Java에서 열거 형을 반복하는 'for'루프


답변:


1400

.values()

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

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

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


43
이 방법의 이유는 값이 () 목록에없는 여기 java.lang.enum에서
jacktrades

80
@jacktrades : 컴파일러에만 존재하는 암시 적 메소드입니다. 따라서 기본 클래스는 동일한 이름을 가진 메소드를 선언 할 수 없으므로 자동으로 생성 된 Javadoc에 포함되지 않습니다. docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.9.2
Torben

4
이상하게 그것은에서 설명한 () 문서 valueOf
greg7gkb

129

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

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

@ RAnders00 맞습니다. 그러나 여전히 대답은 유효하며 형식은 실제로 중요하지 않습니다 (나에게
이상적

무엇을 #합니까?
YoTengoUnLCD 2016 년

@YoTengoUnLCD 기본적으로 values ​​()는 Enum 객체의 일부입니다. 예 Enum#values():Enum.values()
스포트라이트

흠, 죄송합니다. 따르지 않습니다. .(항상 사용합니까?) 와 동일 합니까?
YoTengoUnLCD

3
@YoTengoUnLCD 해시 태그는 Java 코드가 아닌 JavaDoc 구문입니다.
Jeff G

62

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

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

1
java.util.EnumSet 가져 오기 제공
Nate

8
Java8 foreach 루프에 매우 유용합니다. EnumSet.allOf (Enum.class) .forEach (blah-> method (blah))
Hiro2k

1
@ Hiro2k 당신은 또한 할 수 있습니다 Arrays.stream(Enum.values()).forEach(...)-스트림은 순차적
RAnders00

1
@ schatten 글쎄, set대신에 array. 내 의견으로는 열거 형 값을 더 잘 설명하지만 "더 나은"것은 아닙니다. 왜냐하면 집합의 정의에서 set의 값을 반복 할 수는 없지만 (enum과 같이) 배열의 값은 가능합니다.
Jezor

2
@Jezor 비트 플래그와 같은 매우 빠른 열거 집합이 실제로 필요할 때 더 나은 선택입니다.하지만 간단한 반복에는 너무 복잡해 보입니다.
schatten

44

스트림

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

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

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

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


모든 스트림 작업과 마찬가지로 스레드 무국적 및 부작용 제한을 인식 docs.oracle.com/javase/8/docs/api/java/util/stream/... . 이 두 가지 열거 반복 옵션은 이와 관련하여 크게 다릅니다.
buzz3791


19

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

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

2
java.util.EnumSet 및 java.util.Set 가져 오기 제공
Nate

4
다음의 문서에서EnumSet : iterator 메소드에 의해 리턴 된 반복자는 요소를 자연 순서 (열거 상수가 선언 된 순서)로 순회합니다 . 이렇게하면 반복 순서가에서 반환 한 순서와 일치합니다 Enum.values().
Jeff G

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

5

자바 8

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

Java5 이상에서

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

1
미안 나는 akhil_mittal이 이미 비슷한 대답을 게시했다는 것을 깨달았습니다.
Raghu K Nair

언제, 왜 Stream.of (o) .forEach를 사용해야합니까? for 루프는 훨씬 읽기 쉽습니다.
제레미

함수형 프로그래밍에 익숙하지 않다면 아닙니다.
Alexis Dufrenoy

5

각각에 대해

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

4

Java 8의 더 많은 메소드 :

EnumSet함께 사용forEach

EnumSet.allOf(Direction.class).forEach(...);

Arrays.asList함께 사용forEach

Arrays.asList(Direction.values()).forEach(...);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.