我怎样才能到达数组的迭代器?

时间:2013-06-09 10:36:11

标签: java

我想像下面这样使用以下类:

for(String device : new Devices())
{
   //
}

如果我提供对内部字符串数组的直接访问,那么就没有问题:

for(String device : new Devices().getAllDevices()) //getAllDevices would be a String[]
{
   //
}

但我只想转发迭代器,如果AllDevicesArrayList,这将很简单。

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();
}

3 个答案:

答案 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[])

请参阅http://commons.apache.org/proper/commons-collections/javadocs/api-release/org/apache/commons/collections/IteratorUtils.html

答案 2 :(得分:2)

您可以使用Guava的Iterators.forArray(T...)来创建迭代器。

或者,从您的数组中制作Iterable(例如使用Arrays.asList(T...))并返回其.iterator()