如何将字符串数组和字符串作为可变参数传递?
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));
我想将一个数组和一个对象传递给具有可变参数的方法。
但是,最明显的解决方案似乎不起作用:
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));