我想像下面这样使用以下类:
for(String device : new Devices())
{
//
}
如果我提供对内部字符串数组的直接访问,那么就没有问题:
for(String device : new Devices().getAllDevices()) //getAllDevices would be a String[]
{
//
}
但我只想转发迭代器,如果AllDevices
是ArrayList
,这将很简单。
public final class Devices implements Iterable<String>{
private static final String MyKindleFire = "123156448975312";
private static final String[] AllDevices = new String[]{MyKindleFire};
@Override
public Iterator<String> iterator() {
// if AllDevices were an array list, this would be possible
// but how should I do this for an array?
return AllDevices.iterator();
}
}
这有效,但如果可能的话,我想知道更好的方法:
@Override
public Iterator<String> iterator() {
return Arrays.asList(AllDevices).iterator();
}
答案 0 :(得分:4)
不幸的是,如果不将数组转换为List<T>
,就无法做到这一点:使用for
循环的“foreach”版本迭代数组是一个“编译技巧”,即编译器知道的内容和在内部。
在“foreach”循环中使用原语的能力是间接指示Iterator<T>
未在那里使用,因为Java泛型不能与原始类型一起使用。
答案 1 :(得分:3)
String[] someArray = ....;
List<String> someList = java.util.Arrays.asList(someArray);
someList.iterator();
我认为这是在纯java中获取数组迭代器的唯一方法。
如果您使用的是apache commons-collections,则只需使用:
org.apache.commons.collections.IteratorUtils.arrayIterator(Object[])
答案 2 :(得分:2)
您可以使用Guava的Iterators.forArray(T...)
来创建迭代器。
或者,从您的数组中制作Iterable
(例如使用Arrays.asList(T...)
)并返回其.iterator()
。