可迭代转换器的通用枚举 [已关闭]
HttpServletRequest正在使用大量的java.util.Enumeration。我想在for-each中使用它们,所以我需要将它们转换为可交互的。这不是问题,但是由于我有多个项目需要这个,所以我需要一个库来做到这一点。我宁愿不自己制作 - 是否有任何标准库支持这种装饰?
是否有内置构造将枚举转换为可迭代的构造?
HttpServletRequest正在使用大量的java.util.Enumeration。我想在for-each中使用它们,所以我需要将它们转换为可交互的。这不是问题,但是由于我有多个项目需要这个,所以我需要一个库来做到这一点。我宁愿不自己制作 - 是否有任何标准库支持这种装饰?
是否有内置构造将枚举转换为可迭代的构造?
这是来自Guava的javadoc,关于枚举到迭代器的转换(不可迭代):
公共静态不可修改的枚举器(枚举枚举)
使枚举适应迭代器接口。
此方法在迭代对象中没有等效项,因为不可能将枚举视为可迭代对象。但是,可以使用 Collections.list(java.util.Enumeration) 将内容复制到集合中。
此外,更多的apache共享资源集合当前实现不支持Java 5功能和API(如Iterable),因此没有机会。
但是,这些库中有一些方法允许您将枚举更改为可迭代的集合并使用它(尽管它们确实隐式复制了您的数据)。
例如,使用 EnumerationUtils.toList(enumeration) 转换为列表。
编辑:由于问题中的一些疑问,我将尝试总结为什么番石榴的制造商(和我)不觉得枚举可以成为可迭代的。
可迭代创建迭代器实例,读取代码(或API)的人可以假设每次调用iterator()都会产生一个新的迭代器实例,从第一个元素开始枚举。如果我们在迭代器(或枚举)和可迭代器之间进行简单的转换,那么API的用户需要知道对iterator()的调用会改变对象的状态,并且连续2次调用可能会表现得很奇怪。下面是一个示例:
Iterable<String> iter = magicFunction(enumeration);
for (String s : iter) {
if ("hello".equals(s))
break;
}
for (String s : iter) {
if ("world".equals(s))
return true;
}
return false;
如果实现为一个简单的转换(O(1)),上述方法对于不同的输入的行为不同:将返回,而将返回。在查看代码时,这一点并不明显,并且可能是导致许多令人沮丧的错误的原因。因此,我认为不存在这种实用程序方法是有意义的。["hello","world"]
true
["world","hello"]
false