Java数组和foreach迭代实现

时间:2011-09-28 22:38:29

标签: java foreach iteration

是否有一些接口允许迭代数组和java.util.Lists?

看看for-each循环如何迭代两者,在我看来,在这两种情况下都必须存在某种基类'iterable'。

那么,我可以设置一个接受Foo []或List吗?

的方法参数

我们有很多旧代码(我们不会更新),它会调用一些期望数组的低级方法(我想更新)。

我们的新代码是使用List的toArray方法从Lists(特别是ArrayLists)转换为数组,我希望能够跳过这一步。

我看过显示实施的this帖子,但我不确定它会有什么帮助。

可以这样做吗?

4 个答案:

答案 0 :(得分:4)

不,语言规范显式分别调用数组。数组不实现Iterable<T>,这是增强的for循环使用的“普通”接口,而不是数组。来自section 14.14.2 of the JLS

  

增强的for语句具有以下形式:

 EnhancedForStatement:
       for ( VariableModifiers Type Identifier: Expression) Statement
     

Expression 必须具有类型Iterable,否则它必须是数组类型(§10.1),否则会发生编译时错误。

然后分别处理这两个案件。

从数组转换到列表当然很容易 - 但听起来你需要反过来这样做。实际上没有“愉快”的方式 - 当然,创建数组需要复制所有内容。

将至少最常用的API转换为使用列表需要多少工作?

您当然可以编写方法重载,例如

public void foo(String[] array)
{
    foo(Arrays.asList(array));
}

public void foo(List<String> list)
{
    // Use the list
}

...但是为旧代码执行此操作仍将涉及工作,因为真正的实现是根据列表而不是数组。

答案 1 :(得分:1)

Java本可以使Foo[]成为Iterable<Foo>的子类型;遗憾的是,这不适用于原始数组,因为Java不支持基本类型参​​数,所以我们没有这个精确性。

答案 2 :(得分:0)

我认为数组在for循环的实现中只是特殊的。

您可以做的一件事是重载您的方法:

public void foo(MyClass[] stuff) {
    foo(Arrays.asList(stuff));
}

public void foo(Collection<MyClass> stuff) {
    // stuff
}

或者相反:

public void foo(MyClass[] stuff) {
    // stuff
}

public void foo(Collection<MyClass> stuff) {
    foo(stuff.toArray(new MyClass[stuff.size()]));
}

答案 3 :(得分:0)

没有这样一个通用界面,Array没有实现Iterable

你可以做的是超载你的方法:

public void mymethod(String ... strings) {
   mymethod(Arrays.asList(strings));
}

public void mymethod(List<String> strings) {
   // do what you need
}