1

我想像这样使用以下类:

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

3 回答 3

4

不幸的是,如果不将数组转换为List<T>:使用循环的“foreach”版本对数组进行迭代for是一种“编译器技巧”,即编译器知道并在内部执行的操作,您将无法做到这一点。

在“foreach”循环中使用原语的能力是一种间接指示,Iterator<T>它没有在那里使用,因为 Java 泛型不能与原语类型一起使用。

于 2013-06-09T10:39:59.723 回答
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

于 2013-06-09T10:39:47.490 回答
2

您可以使用 GuavaIterators.forArray(T...)制作迭代器。

或者,Iterable从你的数组中创建一个(例如 with Arrays.asList(T...))并返回它的.iterator().

于 2013-06-09T10:42:34.230 回答