Program Tip

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

programtip 2020. 9. 28. 09:54
반응형

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문서에 나열되지 않습니다 .


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   
    }

자바 8

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

Java5 +에서

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

각각에 대해 사용하십시오

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

Java 8의 추가 메소드 :

EnumSet함께 사용forEach

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

Arrays.asList함께 사용forEach

Arrays.asList(Direction.values()).forEach(...);

참고URL : https://stackoverflow.com/questions/1104975/a-for-loop-to-iterate-over-an-enum-in-java

반응형