繁体   English   中英

Java数组和foreach迭代实现

[英]Java arrays and foreach iteration implementation

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

在我看来,for-each循环如何能够迭代两者,在这两种情况下都必须遍历某种基本的“可迭代”。

因此,我可以设置一个接受Foo []或List的方法参数吗?

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

我们的新代码正在使用List的toArray方法将列表(大多数情况下,尤其是ArrayLists)转换为数组,我希望能够跳过此步骤。

我看过这篇文章,展示了实现,但是我不确定它可能有什么帮助。

能做到吗?

不,语言规范明确地单独调用数组。 数组不实现Iterable<T> ,它是增强型for循环(而非数组)使用的“常规”接口。 JLS的14.14.2节开始

for语句的增强形式为:

  EnhancedForStatement: for ( VariableModifiers Type Identifier: Expression) Statement 

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

然后分别处理这两种情况。

从数组到列表的转换当然很容易-但是听起来您需要反过来进行。 确实没有做到这一点的“令人愉悦”的方法-当然,创建数组需要复制所有内容。

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

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

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

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

...但是对您的旧代码执行此操作仍会涉及工作,因为真正的实现取决于列表而不是数组。

Java可以使Foo[]成为Iterable<Foo>的子Iterable<Foo> 不幸的是,这不适用于基本数组,因为Java不支持基本类型参​​数,因此我们没有这种优点。

我认为数组在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()]));
}

没有这样的通用接口, Array不实现Iterable

您可以做的是重载方法:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM