我为什么不能做:
Enumeration e = ...
for (Object o : e)
...
Answers:
因为Enumeration<T>
不扩展Iterable<T>
。这是进行Iterable Enumerations的示例。
至于为什么这是一个有趣的问题。这不完全是您的问题,但却为您提供了一些启示。来自Java Collections API设计常见问题解答:
为什么Iterator不扩展枚举?
我们认为不幸的是Enumeration的方法名称。它们很长,而且经常使用。鉴于我们要添加一种方法并创建一个全新的框架,我们认为不利用机会来改进名称是愚蠢的。当然,我们可以在Iterator中支持新名称和旧名称,但这似乎并不值得。
这基本上向我表明Sun希望与Enumeration保持距离,Enumeration是非常早期的Java,具有相当冗长的语法。
for(; e.hasMoreElements(); ) { e.getNextElement(); }
Iterators
两者都不Iterable
是。你做不到for (obj : itr)
。这是因为Iterable
它实际上是可重复迭代的,而迭代器只能迭代一次。
Enumeration
在新for
语法中不允许使用anIterable
和an array
。
使用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)) {
...
}
新样式的循环(“ foreach”)适用于数组以及实现Iterable
接口的事物。
它也Iterator
比更加相似Iterable
,因此,Enumeration
除非Iterator
也这样做,否则与foreach一起工作是没有意义的。
Enumeration
也不鼓励Iterator
。
Enumeration
没有实现Iterable
,因此不能直接在foreach循环中使用。但是,使用Apache Commons Collections可以用以下方法遍历枚举:
for (Object o : new IteratorIterable(new EnumerationIterator(e))) {
...
}
您也可以使用较短的语法,Collections.list()
但这会降低效率(对元素进行两次迭代并增加内存使用量):
for (Object o : Collections.list(e))) {
...
}
我们可以使用for循环使用来遍历枚举 .values()
method
which returns all the elements contained in the enumeration.
一个例子 :
for (USERS_ROLES userRole: USERS_ROLES .values ()) {
System.out.println ("This is one user role:" + userRole.toString ());
}
我在Java 10中做到了