Как создать метод Java, который принимает переменное количество аргументов? - PullRequest
67 голосов
/ 30 сентября 2011

Например, собственный Java String.format() поддерживает переменное количество аргументов.

String.format("Hello %s! ABC %d!", "World", 123);
//=> Hello World! ABC 123!

Как я могу создать свою собственную функцию, которая принимает переменное количество аргументов?


Дополнительный вопрос:

Я действительно пытаюсь сделать удобное сокращение для этого:

System.out.println( String.format("...", a, b, c) );

Чтобы я мог назвать его как-то менее многословным, как это:

print("...", a, b, c);

Как мне этого добиться?

Ответы [ 7 ]

112 голосов
/ 30 сентября 2011

Вы можете написать удобный метод:

public PrintStream print(String format, Object... arguments) {
    return System.out.format(format, arguments);
}

Но, как вы видите, вы просто переименовали format (или printf).

Вот как выможно использовать его:

private void printScores(Player... players) {
    for (int i = 0; i < players.length; ++i) {
        Player player = players[i];
        String name   = player.getName();
        int    score  = player.getScore();
        // Print name and score followed by a newline
        System.out.format("%s: %d%n", name, score);
    }
}

// Print a single player, 3 players, and all players
printScores(player1);
System.out.println();
printScores(player2, player3, player4);
System.out.println();
printScores(playersArray);

// Output
Abe: 11

Bob: 22
Cal: 33
Dan: 44

Abe: 11
Bob: 22
Cal: 33
Dan: 44

Обратите внимание, что есть также аналогичный метод System.out.printf, который ведет себя так же, но если вы посмотрите на реализацию, printf просто вызовет format, так что вы можете такжеиспользуйте format напрямую.

26 голосов
/ 30 сентября 2011

Это известно как varargs см. Ссылку здесь для более подробной информации

В прошлых выпусках Java метод, который принимал произвольное количество значений, требовал от вас создания массива и помещения значений в массив до вызова метода. Например, вот как можно использовать класс MessageFormat для форматирования сообщения:

Object[] arguments = {
    new Integer(7),
    new Date(),
    "a disturbance in the Force"
};
    String result = MessageFormat.format(
        "At {1,time} on {1,date}, there was {2} on planet "
         + "{0,number,integer}.", arguments);

Все еще верно, что в массиве должны быть переданы несколько аргументов, но функция varargs автоматизирует и скрывает процесс. Кроме того, он совместим с предыдущими API. Так, например, метод MessageFormat.format теперь имеет следующее объявление:

public static String format(String pattern,
                            Object... arguments);
9 голосов
/ 30 сентября 2011

Посмотрите руководство по Java на varargs .

Вы можете создать метод, как показано ниже. Просто позвоните System.out.printf вместо System.out.println(String.format(....

public static void print(String format, Object... args) {
    System.out.printf(format, args);
}

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

import static java.lang.System.out;

out.printf("Numer of apples: %d", 10);
3 голосов
/ 21 мая 2015

Это всего лишь расширение для предоставленных выше ответов.

  1. В методе может быть только один переменный аргумент.
  2. Переменный аргумент (varargs) должен быть последним аргументом.

Четко объяснено здесь и правила, которым необходимо следовать для использования Переменная Аргумент .

2 голосов
/ 30 сентября 2011

Следующее создаст набор аргументов переменной длины типа строки:

print(String arg1, String... arg2)

Затем вы можете ссылаться на arg2 как массив строк.Это новая функция в Java 5.

0 голосов
/ 09 августа 2016

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

static void demo (String ... stringArray) {
  your code goes here where read the array stringArray
}
0 голосов
/ 30 сентября 2011

Аргументы переменной должны быть последними из параметров, указанных в объявлении вашей функции.Если вы попытаетесь указать другой параметр после аргументов переменной, компилятор будет жаловаться, поскольку невозможно определить, сколько из параметров действительно принадлежит аргументу переменной.

void print(final String format, final String... arguments) {
    System.out.format( format, arguments );
}
...