답변:
.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);
}
#
합니까?
Enum#values()
:Enum.values()
.
(항상 사용합니까?) 와 동일 합니까?
다음과 같이 할 수 있습니다 :
for (Direction direction : EnumSet.allOf(Direction.class)) {
// do stuff
}
Arrays.stream(Enum.values()).forEach(...)
-스트림은 순차적
set
대신에 array
. 내 의견으로는 열거 형 값을 더 잘 설명하지만 "더 나은"것은 아닙니다. 왜냐하면 집합의 정의에서 set의 값을 반복 할 수는 없지만 (enum과 같이) 배열의 값은 가능합니다.
for (Direction dir : Direction.values()) {
System.out.println(dir);
}
람다와 스트림을 사용할 수도 있습니다 ( 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
}
EnumSet
: iterator 메소드에 의해 리턴 된 반복자는 요소를 자연 순서 (열거 상수가 선언 된 순서)로 순회합니다 . 이렇게하면 반복 순서가에서 반환 한 순서와 일치합니다 Enum.values()
.
자바 8
Stream.of(Direction.values()).forEach(System.out::println);
Java5 이상에서
for ( Direction d: Direction.values()){
System.out.println(d);
}