[英]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.