Java数组和foreach迭代实现
是否存在允许对数组和java.util.List进行i操作的接口 鉴于for-each循环如何迭代这两种情况,在我看来,在这两种情况下都必须遍历某种基本的“iterable” 那么,我可以设置一个接受Foo[]或List的方法参数吗 我们有很多旧代码(我们不会更新),它们调用了一些需要数组的低级方法(我想更新) 我们的新代码正在使用List的toArray方法将列表(尤其是ArrayList)转换为数组,我希望能够跳过这一步 我看过一篇文章,其中展示了实现,但我不确定它会有什么帮助Java数组和foreach迭代实现,java,foreach,iteration,Java,Foreach,Iteration,是否存在允许对数组和java.util.List进行i操作的接口 鉴于for-each循环如何迭代这两种情况,在我看来,在这两种情况下都必须遍历某种基本的“iterable” 那么,我可以设置一个接受Foo[]或List的方法参数吗 我们有很多旧代码(我们不会更新),它们调用了一些需要数组的低级方法(我想更新) 我们的新代码正在使用List的toArray方法将列表(尤其是ArrayList)转换为数组,我希望能够跳过这一步 我看过一篇文章,其中展示了实现,但我不确定它会有什么帮助 可以这样做吗
可以这样做吗?不,语言规范明确地单独调用数组。数组不实现
Iterable
,这是增强for循环(而不是数组)使用的“正常”接口。发件人:
增强型for语句的形式如下:
EnhancedForStatement:
for ( VariableModifiers Type Identifier: Expression) Statement
表达式必须具有类型Iterable
,否则必须是数组类型(),否则会发生编译时错误
这两起案件随后分别处理
当然,从数组到列表的转换很容易,但听起来你需要反过来做。实际上没有“令人愉快”的方法来实现这一点——当然,创建数组需要复制所有内容
将API中使用最频繁的部分转换为使用列表需要多少工作
当然,您可以编写方法重载,例如
public void foo(String[] array)
{
foo(Arrays.asList(array));
}
public void foo(List<String> list)
{
// Use the list
}
公共void foo(字符串[]数组)
{
foo(Arrays.asList(array));
}
公开作废foo(列表)
{
//使用列表
}
。。。但是为旧代码这样做仍然需要工作,因为真正的实现是列表,而不是数组。我认为数组只是
循环实现的特例
您可以做的一件事是重载您的方法:
public void foo(MyClass[] stuff) {
foo(Arrays.asList(stuff));
}
public void foo(Collection<MyClass> stuff) {
// stuff
}
publicsvoidfoo(MyClass[]stuff){
foo(Arrays.asList(stuff));
}
公共图书馆(收集资料){
//东西
}
或者反过来说:
public void foo(MyClass[] stuff) {
// stuff
}
public void foo(Collection<MyClass> stuff) {
foo(stuff.toArray(new MyClass[stuff.size()]));
}
publicsvoidfoo(MyClass[]stuff){
//东西
}
公共图书馆(收集资料){
foo(stuff.toArray(新的MyClass[stuff.size()]);
}
没有这样一个通用接口,数组
不能实现Iterable
您可以做的是重载您的方法:
public void mymethod(String ... strings) {
mymethod(Arrays.asList(strings));
}
public void mymethod(List<String> strings) {
// do what you need
}
public void mymethod(字符串…字符串){
mymethod(Arrays.asList(strings));
}
公共void mymethod(列表字符串){
//做你需要的
}
Java可以将Foo[]
作为Iterable的子类型;不幸的是,这在基元数组上不起作用,因为Java不支持基元类型参数,所以我们没有这种精确性 -谢谢。您知道Arrays.asList是否比List.toArray“便宜”吗?我尝试用谷歌搜索该主题,但还没有看到任何帮助。@redvider:Yes:数组。asList
提供了一个由现有数组支持的列表,即不涉及复制的视图<代码>列表。toArray
必须复制所有数据。