由于我们的特定需求,我不得不将 ResourceBundle
子类化。
但是,要覆盖getKeys()
,我有点麻烦。此 getKeys
需要以某种方式从底层 ResourceBundle
的映射中串联起来。我该怎么做?
谢谢
编辑:提交时我想到了一个主意。基本上我们的每个 Module
都有一个 ResourceBundle
,所以到目前为止我的代码看起来像这样:
public Enumeration<String> getKeys() {
ArrayList<String> keys = new ArrayList<String>();
for (Map.Entry<Module, ResourceBundle> entry : internalMap.entrySet()) {
Enumeration<String> tmp = entry.getValue().getKeys();
while (tmp.hasMoreElements()) {
String key = tmp.nextElement();
keys.add(key);
}
}
return Collections.enumeration(keys);
}
最佳答案
最简单的方法就是手动枚举枚举,将它们转储到集合中,然后返回该集合的枚举。
否则,您可以合并 Google Guava操作来做到这一点,像这样:
// the map of enumerations
Map<?, Enumeration<String>> map = ...
// a function that turns enumerations into iterators
Function<Enumeration<String>, Iterator<String>> eumerationToIteratorFunction = new Function<Enumeration<String>, Iterator<String>>() {
public Iterator<String> apply(Enumeration<String> enumeration) {
return Iterators.forEnumeration(enumeration);
}
};
// transform the enumerations into iterators, using the function
Collection<Iterator<String>> iterators = Collections2.transform(map.values(), eumerationToIteratorFunction);
// combine the iterators
Iterator<String> combinedIterator = Iterators.concat(iterators);
// convert the combined iterator back into an enumeration
Enumeration<String> combinedEnumeration = Iterators.asEnumeration(combinedIterator);
这很麻烦,但是 Enumeration
已经过时并且在现代 API 中的支持相当差。它可以通过明智地使用静态导入来稍微精简。您甚至可以在单个函数式语句中完成所有操作:
Map<?, Enumeration<String>> map = ...
Enumeration<String> combinedEnumeration = asEnumeration(concat(
transform(map.values(), new Function<Enumeration<String>, Iterator<String>>() {
public Iterator<String> apply(Enumeration<String> enumeration) {
return forEnumeration(enumeration);
}
})
));
这种方法的好处是高效 - 它以惰性方式执行所有操作,并且在您提出要求之前不会进行迭代。不过,在您的情况下,效率可能并不重要,在这种情况下,只需采用简单的方法即可。
关于java - 连接几个枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8333513/