如何在方法调用中将数组解压缩到不同的参数中

时间:2013-07-24 14:30:47

标签: java

我想知道是否可以将Object数组解压缩到接受vargs的方法调用上的单独Object中。此问题与this one类似。

我有一个代码:

public class Test {
    public static Object doWork(Object... objects){
        System.out.println(objects.length);
        return objects;
    }

    public static void main(String[] args){
        Object res = doWork("one", "two");
        res = doWork("three", res);
    }
}

我想在第二次调用中解压缩res对象,这样它就会收到一个长度为3而不是长度为2的对象数组(其中第二个位置是长度为2的Object数组,然后有这三个论点)。

甚至可以用Java编写吗?


更详细:

通过

Object res = doWork("one", "two");
res = doWork("three", res);

第二个调用被称为:

doWork( Object[ "three", Object[ "one", "two" ] ] )

我希望:

doWork(Object[ "one", "two", "three" ] )

我知道这可以通过以下方式实现:

public static void main(String[] args){
res = doWork("one", "two");
    List<Object> los = Arrays.asList(res);
    los = new ArrayList<>(los);     // Can't modify an underlying array
    los.add("three");
    res = doWork(los.toArray());
}

但我正在寻找像unpack Lua内置函数或前面提到的SO问题中描述的Python方法。


@chancea和@ Cyrille-ka给出的答案都很好,也解决了问题。考虑到方法的签名是否可以被修改的事实之一可能是一个好主意。 @ cyrille-ka回答尊重函数的签名,而@chancea则不尊重。但是我认为在大多数情况下,人们可以将简单的包装函数写入另一个,所以这应该不是问题。 另一方面,@ chancea的方式在编程时可能更容易使用(没有忘记调用解包函数的错误)。

3 个答案:

答案 0 :(得分:2)

嗯,Java中没有Python或Lua的语法糖,但您可以创建自己的unpack方法:

@SafeVarargs
public static <E> Object[] unpack(E... objects) {
    List<Object> list = new ArrayList<Object>();
    for (Object object : objects) {
        if (object instanceof Object[]) {
            list.addAll(Arrays.asList((Object[]) object));
        }
        else{
            list.add(object);
        }
    }

    return list.toArray(new Object[list.size()]);
}

这将返回一个包含所有输入元素的数组,解压缩。

然后您可以使用main方法调用它:

res = doWork(unpack("three", res));

我将此方法设为通用的原因是您可以使用例如String[]数组调用它,而不会生成警告。出于某种原因,Java编译器认为此方法有可能“污染堆”,但情况并非如此,这就是我添加@SafeVarargs注释的原因。

答案 1 :(得分:1)

这不会实现Unpack解决方案,而是像我在评论中所说的那样制作overload method。我不知道这根本不是你想要的,但是我得到它的工作,我觉得我会发布这个作为参考。

public class Test {
    public static Object doWork(Object... objects){
        System.out.println(objects.length);
        return objects;
    }

    // this is the method that will concatenate the arrays for you
    public static Object doWork(Object[] objects1, Object... objects2){
        System.out.println(objects1.length + "+" + objects2.length);
        Object[] retval = new Object[objects1.length+objects2.length];
        System.arraycopy(objects1, 0, retval, 0, objects1.length);
        System.arraycopy(objects2, 0, retval, objects1.length, objects2.length);
        return retval;
    }

    public static void main(String[] args){
        Object res = doWork("one", "two");
        res = doWork((Object[])res, "three");
        Object[] res2 = (Object[])res; // = {one, two, three}
    }
}

答案 2 :(得分:0)

尝试以Object的数组形式返回。然后在返回的数组的末尾连接"three"