如何将字符串数组和字符串作为vararg传递?

时间:2015-01-13 08:57:46

标签: java arrays variadic-functions

我想将数组和单个对象传递给具有varargs的方法。

然而,最明显的解决方案似乎不起作用:

public static final String[] ARRAY_ARGS =  {"first argument", "second argument"};
public static String additionalArgument = "additional argument";

public static void foo(String... args) {
    // ...
}

public static void main(String[] args) {
    foo(ARRAY_ARGS,additionalArgument); // error! won't compile
}

我该如何解决这个问题?

6 个答案:

答案 0 :(得分:3)

变量参数等同于数组。因此,编译器不接受数组字符串。一种解决方案是从原始数组创建一个数组,并添加额外的字符串:

List<String> originalList = Arrays.asList(ARRAY_ARGS);
List<String> list = new ArrayList<String>(originalList);
Collections.copy(list, originalList);
list.add(additionalArgument);
foo(list.toArray(new String[list.size()]));

需要Collections.copy,因为添加Arrays.asList返回的列表会引发java.lang.UnsupportedOperationException,因为后者返回扩展AbstractList的列表,该列表不支持添加元素。

另一个解决方案是创建一个新数组并单独添加元素:

String[] arr = new String[3];
arr[0] = ARRAY_ARGS[0];
arr[1] = ARRAY_ARGS[1];
arr[2] = additionalArgument;
foo(arr);

或者您只需使用各个参数调用foo

foo(ARRAY_ARGS[0], ARRAY_ARGS[1], additionalArgument);

答案 1 :(得分:1)

如果方法的第一个参数是单个字符串,后跟varargs,你可以这样做:

public static void foo(String a, String... args) {
    System.out.println("a = " + a);
    System.out.println("args = " + Arrays.toString(args));
}

然后调用foo("a", "b", "c")打印

a = a
args = [b, c]

答案 2 :(得分:0)

参数String ... argsString[]的简写。因此,在您致电foo(args,additionalargument)时会收到错误,因为foo的方法声明为foo(String[] str)而不是foo(String[],String)

答案 3 :(得分:0)

如果必须区分数组和单个字符串,请以可以“识别”的格式连接数组值,将“array-string”和单个字符串作为参数传递给main方法,然后解析相关(foo)方法中的“array-string”。

答案 4 :(得分:0)

解决此问题的Java 8方法是以下oneliner:

foo(Stream.concat(Arrays.stream(ARRAY_ARGS), Stream.of(additionalArgument)).toArray(String[]::new)); 

这会创建一个可以传递给String[]的新foo。此外,foo必须设为static,否则代码将无法编译。

您可以传递给foo - 方法的唯一参数是String数组或一堆单独的String

答案 5 :(得分:0)

使用Apache Commons Lang库的简单而优雅的解决方案:

foo(ArrayUtils.addAll(ARRAY_ARGS,additionalArgument));