我想将数组和单个对象传递给具有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
}
我该如何解决这个问题?
答案 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 ... args
是String[]
的简写。因此,在您致电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));