如何将字符串数组和字符串作为可变参数传递?

How to pass array of string and a string as a vararg?

我想将一个数组和一个对象传递给具有可变参数的方法。

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

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
}

我该如何解决这个问题?

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

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 作为后者 returns 扩展 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);

参数 String ... args 是 shorthand 用于 String[]。因此,当您调用 foo(args,additionalargument) 时会出错,因为 foo 的方法声明是 foo(String[] str) 而不是 foo(String[],String).

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

A Java8 解决此问题的方法如下:

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

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

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

如果您的方法的第一个参数是单个字符串,然后是可变参数,您可以这样做:

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]

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

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