Java 열거에서 foreach를 사용할 수없는 이유는 무엇입니까?
내가 할 수없는 이유 :
Enumeration e = ...
for (Object o : e)
...
Enumeration<T>
확장하지 않기 때문에 Iterable<T>
. 다음은 Iterable Enumerations를 만드는 예제입니다 .
왜 그것이 흥미로운 질문인지에 관해서. 이것은 정확히 당신의 질문은 아니지만 그것에 대해 약간의 빛을 비 춥니 다. 로부터 자바 컬렉션 API 디자인 자주 묻는 질문 :
Iterator가 Enumeration을 확장하지 않는 이유는 무엇입니까?
우리는 Enumeration의 메서드 이름을 불행하게 생각합니다. 매우 길고 자주 사용됩니다. 우리가 방법을 추가하고 완전히 새로운 프레임 워크를 만들고 있다는 점을 감안할 때 이름을 개선 할 기회를 이용하지 않는 것은 어리석은 일이라고 생각했습니다. 물론 우리는 Iterator에서 새 이름과 이전 이름을 지원할 수 있지만 가치가 없어 보입니다.
그것은 기본적으로 Sun이 매우 장황한 구문을 가진 매우 초기 Java 인 Enumeration과 거리를두기를 원한다는 것을 나에게 시사합니다.
Collections 유틸리티 클래스를 사용하면 Enumeration을 다음과 같이 반복 할 수 있습니다.
Enumeration headerValues=request.getHeaders("mycustomheader");
List headerValuesList=Collections.list(headerValues);
for(Object headerValueObj:headerValuesList){
... do whatever you want to do with headerValueObj
}
나는이 문제를 두 개의 매우 간단한 클래스, Enumeration
하나는 Iterator
. 열거 형 래퍼는 다음과 같습니다.
static class IterableEnumeration<T>
extends Object
implements Iterable<T>, Iterator<T>
{
private final Enumeration<T> enumeration;
private boolean used=false;
IterableEnumeration(final Enumeration<T> enm) {
enumeration=enm;
}
public Iterator<T> iterator() {
if(used) { throw new IllegalStateException("Cannot use iterator from asIterable wrapper more than once"); }
used=true;
return this;
}
public boolean hasNext() { return enumeration.hasMoreElements(); }
public T next() { return enumeration.nextElement(); }
public void remove() { throw new UnsupportedOperationException("Cannot remove elements from AsIterator wrapper around Enumeration"); }
}
정적 유틸리티 방법 (내 기본 설정)과 함께 사용할 수 있습니다.
/**
* Convert an `Enumeration<T>` to an `Iterable<T>` for a once-off use in an enhanced for loop.
*/
static public <T> Iterable<T> asIterable(final Enumeration<T> enm) {
return new IterableEnumeration<T>(enm);
}
...
for(String val: Util.asIterable(enm)) {
...
}
또는 클래스를 인스턴스화하여 :
for(String val: new IterableEnumeration<String>(enm)) {
...
}
새로운 스타일 for 루프 ( "foreach")는 배열과 Iterable
인터페이스 를 구현하는 것들에서 작동합니다 .
또한 to Iterator
보다 유사 Iterable
하므로 Enumeration
foreach를 사용하지 않는 한 작업하는 것이 합리적이지 않습니다 Iterator
(그렇지 않습니다). Enumeration
에 찬성하는 것도 권장하지 않습니다 Iterator
.
Enumeration
doesn't implement Iterable
and as such can't be used directly in a foreach loop. However using Apache Commons Collections it's possible to iterate over an enumeration with:
for (Object o : new IteratorIterable(new EnumerationIterator(e))) {
...
}
You could also use a shorter syntax with Collections.list()
but this is less efficient (two iterations over the elements and more memory usage) :
for (Object o : Collections.list(e))) {
...
}
With java 8 and beyond this is possible:
import java.util.Collections;
import java.util.Enumeration;
Enumeration e = ...;
Collections.list(e).forEach(o -> {
... // use item "o"
});
Because an Enumeration (and most classes derived from this interface) does not implement Iterable.
You can try to write your own wrapper class.
참고URL : https://stackoverflow.com/questions/1240077/why-cant-i-use-foreach-on-java-enumeration
'UFO ET IT' 카테고리의 다른 글
ES6 객체의 방법 : 화살표 기능 사용 (0) | 2020.11.14 |
---|---|
이 코드보다 Java에서 XML 문서를 문자열로 변환하는 더 우아한 방법이 있습니까? (0) | 2020.11.14 |
Python의 .get () 메서드 이해 (0) | 2020.11.14 |
HTTP 요청 메서드의 페이로드 (0) | 2020.11.14 |
null이 아닌 속성은 null 또는 임시 값을 참조합니다. (0) | 2020.11.14 |