Передача массива методу varargs, который уже имеет ввод

Допустим, у нас есть метод varargs, который принимает на вход String... args. Передать в эту функцию обычный массив String [] нет проблем, но, к сожалению, он не работает, когда метод запускается с другими строками:

String[] someStringArray = new String[5];
varargsMethod("hello", "world", someStringArray);

Я знаю, что нет проблем просто добавить статические строки в список и передать их в результате, но читабельность моего кода пострадает в моем конкретном случае, поэтому я хотел бы избежать этого, если это возможно.

Является ли это возможным?

В некоторых языках (perl, python, javascript, groovy, kotlin и т. Д.) Вы можете использовать оператор распространения (или splat), чтобы разбить массив на такое количество параметров, которое содержит элементы, но это не реализовано в Java. Вот вопрос по теме: stackoverflow.com/questions/46388620/java-spread-operator

Aaron 11.04.2018 14:12
0
1
1 048
3

Ответы 3

В этом случае я предлагаю вам использовать массив в качестве первого параметра и varargs в качестве второго параметра.

Например:

varargsMethod(String[] input, String... extras)

И перегрузка

varargsMethod(String... extras)

Я забыл упомянуть, что не могу изменить метод. Это ProcessBuilder, просто для контекста.

Selbi 11.04.2018 14:10

Это просто. В первом методе вы просто объединяете параметры input и extras в массив и вызываете функцию varargsMethod(String... extras). Таким образом, первая функция становится служебной / вспомогательной функцией.

Mạnh Quyết Nguyễn 11.04.2018 14:12

Вы могли сделать это:

varargsMethod(
    Stream.concat(Stream.of("hello", "world"),Stream.of(someStringArray))
    .toArray(String[]::new));

Это «добавление», которого, как вы сказали, вы пытались избежать, но, по крайней мере, это делается «в строке», поэтому читаемость не так сильно пострадала, как если бы вы сделали это с несколькими операторами.

Это работает и действительно отвечает на вопрос OP, насколько я понимаю, но я не согласен с тем, что встроенное представление делает код более читаемым, и я бы предпочел увидеть простой массив или список, построенный в предыдущих строках.

Aaron 11.04.2018 14:35

Хм, должен согласиться с @Aaron. Моя основная проблема заключается не в том, чтобы сделать его доступным в одну строку, а в удобочитаемости.

Selbi 11.04.2018 14:39

Я предлагаю вам просто заранее составить список команд + параметров, используя List.add и .addAll:

List<String> commandAndParams = new ArrayList();
commandAndParams.add("command");
commandAndParams.add("-p");
commandAndParams.addAll(pParametersList);
commandAndParams.addAll(Arrays.asList(new String[]{"-v", "-t", "-s"}));
commandAndParams.add("-o"); commandAndParams.add(outputfile);

// a varargs method would need a .toArray() cast before being called, 
// but ProcessBuilder has a List<String> constructor.
ProcessBuilder pb = new ProcessBuilder(commandAndParams);

Я смешал разные стили, чтобы вы могли выбрать тот, который лучше всего помогает понять, но вам не следует смешивать их все таким образом.

Я предпочитаю воссоздавать список, а не добавлять необходимый элемент к существующему просто потому, что я полагаю, что ваш существующий список имеет точное значение, которое представлено через имя его переменной и отличается от команды и ее списка параметров, которым я собираюсь скармливать ProcessBuilder ". Вы должны выбрать имя переменной более значимое, чем commandAndParams, если, конечно, можете.

Другие вопросы по теме