让java函数接受集合或数组

让java函数接受集合或数组,java,arrays,collections,function-declaration,Java,Arrays,Collections,Function Declaration,我正在尝试编写一个函数,它接受一些字符串并对它们进行处理 我要做的唯一一件事就是在字符串集上循环。现在,我以一个令人尴尬的结构结束了 public void foo(String[] myStrings){ foo(java.util.Arrays.asList(myStrings)); } public void foo(Iterable<String> myStrings){ for(String i : myStrings){ bar(i);

我正在尝试编写一个函数,它接受一些字符串并对它们进行处理

我要做的唯一一件事就是在字符串集上循环。现在,我以一个令人尴尬的结构结束了

public void foo(String[] myStrings){
    foo(java.util.Arrays.asList(myStrings));
}

public void foo(Iterable<String> myStrings){
    for(String i : myStrings){
        bar(i);
    }
}
对于String[]类型的mystring来说,这是非常有效的代码

是否有一个类可以让foo-accept同时允许集合和数组


简短回答:不。据我所知,数组类型是合成代码,因此不实现
Iterable
或任何其他类型。您需要提供重载方法或要求客户端在调用站点调用
数组。asList

不幸的是,数组没有实现
Iterable
,尽管for each循环在这两个方面都起作用


您只能接受
Iterable
,因为传递数组有点老套(数组相对于
ArrayList
的性能优势可以忽略不计)。使用可以轻松地包装现有数组并将其转换为
列表。

虽然可以在for-each循环中使用数组,但它们不实现
可编辑的
。有两种可能,要么像您所说的那样重载方法,要么只提供iterable变量并强制客户端调用
Arrays.asList()

如果还想提供数组重载,可以将其签名从简单数组更改为varargs:

public void foo(String... myStrings){
    foo(java.util.Arrays.asList(myStrings));
}
在这种情况下,请注意基本体数组和基本体包装器数组之间的不兼容性:

static void foo(int... ints) {}
foo(new Integer[] {1, 2}); // compile error
以及:

和最模糊的部分,带有通用变位符:

static <T> T[] foo(T... ts) {
    return ts;
}
ts
的值是一个包含两个元素的整数数组:
1
2

但是,如果您传递一个基元int数组,则会发生一件有趣的事情:

int[] ints = { 1, 2 };
System.out.println(Arrays.deepToString(foo(ints)));
> [[1, 2]]

在本例中,ts的值是一个int数组的数组(
int[][]
),其中只有一个元素,即最初传递的数组。原因是
int
不是
对象(自动装箱在这里没有帮助),而int数组是,因此
t
type参数的值变成
int[]

谢谢,我想我仍然在试图说服java,在它的内心深处它是python。哈哈,这里没有鸭子输入——对不起。)欢迎来到冗长打字的世界。Java基于湿而不是干的原则(就像在写每件事两次而不是重复自己一样),这是一个很好的调用。我在我编写的任何新代码中都使用ArrayList,但我继承了很多数组。
static <T> T[] foo(T... ts) {
    return ts;
}
Integer[] integers = { 1, 2 };
System.out.println(Arrays.deepToString(foo(integers)));
> [1, 2]
int[] ints = { 1, 2 };
System.out.println(Arrays.deepToString(foo(ints)));
> [[1, 2]]