Suppose I have methods
void m1(Object... objs) {
m2("added", objs);
}
and
void m2(Object... objs) {
for (Object o : objs) {
// do something with Object o
}
}
If I call m1("a", "b")
, I'd like m2
to see an array of 3 Objects (Strings "added", "a" and "b"). However, instead m2
sees just 2 objects: String "added" and an Object[]
array, which internally contains Strings "a" and "b".
How can I get the desired behavior, that is, I simply add elements to the varargs before forwarding them to another method?
You can write a method like this:
public static Object[] merge(Object o, Object... arr) {
Object[] newArray = new Object[arr.length + 1];
newArray[0] = o;
System.arraycopy(arr, 0, newArray, 1, arr.length);
return newArray;
}
and, subsequently:
m2(merge("added", objs));
Use a List
, add your new element, add the elements from the varagrs array, then transform the List
back to an array.
void m1(Object... objs) {
List<Object> list = new ArrayList<>();
list.add("added");
list.addAll(Arrays.asList(objs));
m2(list.toArray());
}
With a LinkedList
you could call addFirst()
.
Varargs is functionally the same as passing in an array, except that the user is not required to construct the array. As per the docs, "the final argument may be passe as an array or as a sequence of arguments" (original italics). As such, if passed as a sequence of arguments, the array is constructed from the variable arguments passed in.
In your case, you want to add something to that array... so you have to create a new array:
void m1(Object... objs){
Object[] newObjs = new Object[objs.length + 1];
newObjs[0] = "added";
System.arraycopy(objs, 0, newObjs, 1, objs.length);
m2(newObjs);
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With