Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java数组和foreach迭代实现_Java_Foreach_Iteration - Fatal编程技术网

Java数组和foreach迭代实现

Java数组和foreach迭代实现,java,foreach,iteration,Java,Foreach,Iteration,是否存在允许对数组和java.util.List进行i操作的接口 鉴于for-each循环如何迭代这两种情况,在我看来,在这两种情况下都必须遍历某种基本的“iterable” 那么,我可以设置一个接受Foo[]或List的方法参数吗 我们有很多旧代码(我们不会更新),它们调用了一些需要数组的低级方法(我想更新) 我们的新代码正在使用List的toArray方法将列表(尤其是ArrayList)转换为数组,我希望能够跳过这一步 我看过一篇文章,其中展示了实现,但我不确定它会有什么帮助 可以这样做吗

是否存在允许对数组和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
必须复制所有数据。