可迭代转换器的通用枚举 [已关闭]

2022-09-01 05:01:01

HttpServletRequest正在使用大量的java.util.Enumeration。我想在for-each中使用它们,所以我需要将它们转换为可交互的。这不是问题,但是由于我有多个项目需要这个,所以我需要一个库来做到这一点。我宁愿不自己制作 - 是否有任何标准库支持这种装饰?

是否有内置构造将枚举转换为可迭代的构造?


答案 1

java.util.Collections有一个将 a 复制到 中的方法,然后您可以在 for-each 循环中使用该方法(请参阅 javadoc)。listEnumerationList


答案 2

这是来自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