2011-09-28 99 views
2

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

看到for-each循环如何遍历这两个循环,在我看来,必须存在某种在两种情况下遍历的基“可迭代”。

所以,我可以设置一个方法参数,接受Foo []或列表?

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

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

我见过this显示实现的帖子,但我不确定它可能会有什么帮助。

可以这样做吗?

+0

[这个问题有几个选项(http://stackoverflow.com/questions/3912765/iterator-for-array)。 –

回答

4

不,语言规范显式地分别调出数组。数组不执行Iterable<T>,这是增强型for循环使用的“常规”接口,而不是数组。从section 14.14.2 of the JLS

增强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 
} 

...但这样做对你的旧代码仍然会涉及到工作,真正实施是在列表中,而不是数组的条款。

+0

- 谢谢。你知道如果Arrays.asList比List.toArray'便宜'吗?我试着用Google搜索这个话题,但还没有看到任何帮助。 – rediVider

+0

@rediVider:是:'Arrays.asList'提供一个由*现有数组支持的列表*,即不涉及复制的视图。 'List.toArray'必须复制所有的数据。 –

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()])); 
} 
0

没有这样一个共同的接口,Array没有实现Iterable

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

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

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

的Java可以做出Foo[]Iterable<Foo>亚型;不幸的是,这对原始数组不起作用,因为Java不支持原始类型参数,所以我们没有这种精确性。