我想知道是否可以将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);
}
}
Run Code Online (Sandbox Code Playgroud)
我想res在第二次调用中解压缩对象,这样它就会收到一个长度为3而不是长度为2的对象数组(其中第二个位置是一个长度为2的Object数组,然后是所有三个参数).
在Java中甚至可能吗?
更详细:
通过做
Object res = doWork("one", "two");
res = doWork("three", res);
Run Code Online (Sandbox Code Playgroud)
第二个调用被调用为:
doWork( Object[ "three", Object[ "one", "two" ] ] )
Run Code Online (Sandbox Code Playgroud)
在哪里我想:
doWork(Object[ "one", "two", "three" ] )
Run Code Online (Sandbox Code Playgroud)
我知道这可以通过以下方式实现:
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());
}
Run Code Online (Sandbox Code Playgroud)
但我正在寻找类似unpackLua内置函数或前面提到的SO问题中描述的Python方式的东西.
@chancea和@ Cyrille-ka给出的答案都很好,也解决了问题.考虑到方法的签名是否可以被修改的事实之一可能是一个好主意.@ cyrille-ka回答尊重函数的签名,而@chancea则不尊重.但是我认为在大多数情况下,人们可以将简单的包装函数写入另一个,所以这应该不是问题.另一方面,@ chancea的方式在编程时可能更容易使用(没有忘记调用解包函数的错误).
好吧,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()]);
}
Run Code Online (Sandbox Code Playgroud)
这将返回一个包含所有未打包输入元素的数组。
然后你可以在你的main方法中调用它:
res = doWork(unpack("three", res));
Run Code Online (Sandbox Code Playgroud)
我将此方法设为通用的原因是您可以使用例如String[]数组调用它,而不会产生警告。由于某种原因,Java编译器认为这种方法有“污染堆”的机会,但事实并非如此,这就是我添加@SafeVarargs注释的原因。