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

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

我有一个代码:

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 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的方式在编程时可能更容易使用(没有忘记调用解包函数的错误)。

好吧,在Java中没有Python或Lua的语法糖,但你可以创建自己的unpack方法:

 @SafeVarargs public static  Object[] unpack(E... objects) { List list = new ArrayList(); 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注释的原因。

这没有实现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} } } 

尝试返回Object作为数组。 然后在返回的数组的末尾连接"three"