Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将T和T[]的混合传递给Java varargs方法_Java_Variadic Functions - Fatal编程技术网

将T和T[]的混合传递给Java varargs方法

将T和T[]的混合传递给Java varargs方法,java,variadic-functions,Java,Variadic Functions,假设您有一个Java方法 void foobar(int id, String ... args) 并希望将字符串数组和字符串都传递到方法中。像这样 String arr1[]={"adas", "adasda"}; String arr2[]={"adas", "adasda"}; foobar(0, "adsa", "asdas"); foobar(1, arr1); foobar(2, arr1, arr2); foobar(3, arr1, "asdas", arr2); 在Pyth

假设您有一个Java方法

void foobar(int id, String ... args)
并希望将字符串数组和字符串都传递到方法中。像这样

String arr1[]={"adas", "adasda"};
String arr2[]={"adas", "adasda"};
foobar(0, "adsa", "asdas");
foobar(1, arr1);
foobar(2, arr1, arr2);
foobar(3, arr1, "asdas", arr2);
在Python中,有一个“*”来表示这一点。有没有比这种丑陋的辅助方法更好的方法

static String[] concat(Object... args) {
    List<String> result = new ArrayList<String>();
    for (Object arg : args) {
        if (arg instanceof String) {
            String s = (String) arg;
            result.add(s);
        } else if (arg.getClass().isArray() && arg.getClass().getComponentType().equals(String.class)) {
            String arr[] = (String[]) arg;
            for (String s : arr) {
                result.add(s);
            }
        } else {
            throw new RuntimeException();
        }
    }
    return result.toArray(new String[result.size()]);
}

Java没有任何内置的语法糖,但是您的helper方法可能会更好:

private static String[] concat(Object... stringOrArrays) {
    List<String> result = new ArrayList<String>();
    for (Object stringOrArray : stringOrArrays) {
        if (stringOrArray instanceof String) {
            result.add((String) stringOrArray);
        } else if (stringOrArray instanceof String[]) {
            Collections.addAll(result, (String[]) stringOrArray);
        } else if (stringOrArray == null) {
            results.add(null)
        } else {
            throw new RuntimeException(stringOrArray + " not a String or String[]");
        }
    }
    return result.toArray(new String[0]);
}
私有静态字符串[]concat(对象…字符串数组){
列表结果=新建ArrayList();
用于(对象字符串阵列:字符串阵列){
if(字符串的字符串数组实例){
结果。添加((字符串)字符串数组);
}else if(字符串[]的字符串数组实例){
Collections.addAll(result,(String[])stringOrArray);
}else if(stringOrArray==null){
results.add(空)
}否则{
抛出新的RuntimeException(StringOrray+“不是字符串或字符串[]”);
}
}
返回result.toArray(新字符串[0]);
}
我可以想出一个单行线(以避免这种方法),但我不推荐:

    foobar(1, new ArrayList<String>() {{
        addAll(Arrays.asList(arr1));
        addAll(Arrays.asList(arr2));
        add(arr3);
    }}.toArray(new String[0]));
foobar(1,新的ArrayList(){{
addAll(Arrays.asList(arr1));
addAll(Arrays.asList(arr2));
添加(arr3);
}}.toArray(新字符串[0]);
一个衬里的唯一优点是类型安全

    foobar(1, new ArrayList<String>() {{
        addAll(Arrays.asList(arr1));
        addAll(Arrays.asList(arr2));
        add(arr3);
    }}.toArray(new String[0]));