gpt4 book ai didi

java - 如何在方法调用时将数组解压缩为不同的参数

转载 作者:搜寻专家 更新时间:2023-10-30 21:33:29 26 4
gpt4 key购买 nike

我想知道是否可以在接受可变参数的方法调用中将对象数组解包为单独的对象。这个问题类似于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 的对象数组,然后具有所有三个参数)。

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

最佳答案

好吧,在 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 注解。

关于java - 如何在方法调用时将数组解压缩为不同的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17837014/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com