为什么我不能这样做:
Enumeration e = ...
for (Object o : e)
...
Run Code Online (Sandbox Code Playgroud)
cle*_*tus 60
因为Enumeration<T>没有延伸Iterable<T>.以下是制作Iterable Enumerations的示例.
至于为什么这是一个有趣的问题.这不是你的问题,但它揭示了它.来自Java Collections API Design FAQ:
为什么Iterator不扩展枚举?
我们将Enumeration的方法名称视为不幸.它们很长,而且经常使用.鉴于我们正在添加一种方法并创建一个全新的框架,我们认为不利用这个机会改进名称是愚蠢的.当然,我们可以在Iterator中支持新旧名称,但这似乎不值得.
这基本上告诉我,Sun希望将自己与Enumeration保持距离,Enumeration是非常早期的Java,语法相当冗长.
小智 43
使用Collections实用程序类,Enumeration可以迭代,如:
Enumeration headerValues=request.getHeaders("mycustomheader");
List headerValuesList=Collections.list(headerValues);
for(Object headerValueObj:headerValuesList){
... do whatever you want to do with headerValueObj
}
Run Code Online (Sandbox Code Playgroud)
我用两个非常简单的类解决了这个问题,一个用于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"); }
}
Run Code Online (Sandbox Code Playgroud)
哪个可以使用静态实用程序方法(这是我的偏好):
/**
* 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)) {
...
}
Run Code Online (Sandbox Code Playgroud)
或者通过实例化类:
for(String val: new IterableEnumeration<String>(enm)) {
...
}
Run Code Online (Sandbox Code Playgroud)
新式 for 循环(“foreach”)适用于数组以及实现Iterable。
它也比Iteratorto更相似,因此与 foreach 一起使用Iterable是没有意义的,除非也这样做了(而且它没有这样做)。
也是不赞成的。EnumerationIteratorEnumerationIterator