Java 如何获得数组的迭代器?

Java 如何获得数组的迭代器?,java,Java,我想这样使用下面的类: for(String device : new Devices()) { // } 如果我提供对内部字符串数组的直接访问,则没有问题: for(String device : new Devices().getAllDevices()) //getAllDevices would be a String[] { // } 但是我只想转发迭代器,如果AllDevices是ArrayList,这将非常简单 public final class Devices

我想这样使用下面的类:

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();
    }   
}
公共最终类设备实现Iterable{
私有静态最终字符串MyKindleFire=“123156448975312”;
私有静态最终字符串[]AllDevices=新字符串[]{MyKindleFire};
@凌驾
公共迭代器迭代器(){
//如果AllDevices是一个数组列表,那么这是可能的
//但是我应该如何为数组执行此操作?
返回AllDevices.iterator();
}   
}
这是可行的,但我想知道一个更好的方法,如果可能的话:

@Override
public Iterator<String> iterator() {
    return Arrays.asList(AllDevices).iterator();
}
@覆盖
公共迭代器迭代器(){
返回Arrays.asList(AllDevices.iterator();
}


请参见

不幸的是,如果不将数组转换为
列表
,则无法执行此操作:使用
for
循环的“foreach”版本对数组进行迭代是一种“编译器技巧”,即编译器知道并在内部执行的操作


在“foreach”循环中使用原语的能力间接表明那里没有使用
迭代器,因为Java泛型不能与原语类型一起使用。

不幸的是,如果不将数组转换为
列表
:使用“foreach”在数组上迭代,就不能这样做
for
循环的版本是一种“编译器技巧”,即编译器内部知道并执行的操作

在“foreach”循环中使用原语的能力间接表明那里没有使用
迭代器,因为Java泛型不能与原语类型一起使用。

您可以使用Guava来制作迭代器

或者,从数组中创建一个
Iterable
(例如,使用
Arrays.asList(T..)
)并返回其
.iterator()
您可以使用番石榴制作迭代器


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

这是关于原语的一个重要观点,我没有想到。更直接的“指示”[:-)]是JLS 14.14.2,它确切地说明了增强型for循环对阵列的意义。这是关于原语的一个重要观点,我没有想到。一个更直接的“指示”[:-)]是JLS 14.14.2,它确切地说明了增强型for循环对阵列的意义。是的,我看到一些库正在这样做,这一条很有趣,因为它甚至附带了一条注释,说明
数组.asList
更可取。“注意:通常最好使用集合类型来表示数据,例如使用
数组。asList(Object[])
,这样就不需要此方法。”是的,我看到一些库正在这样做,这一个很有趣,因为它甚至附带了一条注释,说明
数组。asList
更可取。注意:通常最好使用集合类型来表示数据,例如使用
数组.asList(Object[])
,这样就不需要此方法
String[] someArray = ....;
List<String> someList = java.util.Arrays.asList(someArray);
someList.iterator();
org.apache.commons.collections.IteratorUtils.arrayIterator(Object[])