Как создать метод Java, который принимает переменное количество аргументов?


например, собственный 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 65

7 ответов:

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

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 непосредственно.

Это известно как 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.формат метод теперь имеет это объявление:

public static String format(String pattern,
                            Object... arguments);

взгляните на руководство 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);

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

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

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

ниже будет создан набор аргументов переменной длины типа string:

print(String arg1, String... arg2)

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

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

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

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

static void demo (String ... stringArray) {
  your code goes here where read the array stringArray
}