- Методы для работы с переменным количеством аргументов
- A может Вас также заинтересует что-нибудь из этого:
- Java varargs
- Что такое varargs?
- 5 правил varargs
- Примеры varargs
- Когда использовать varargs?
- Заключение
- Программирование на C, C# и Java
- Уроки программирования, алгоритмы, статьи, исходники, примеры программ и полезные советы
- Переменное число аргументов в Java
- Определение метода с переменным числом аргументов
Методы для работы с переменным количеством аргументов
Методы для работы с переменным количеством аргументов, позволяют принимать произвольное количество аргументов. До выхода JDK 5.0 для передачи методу произвольного числа аргументов, необходимо было использовать массив объектов. Более того, отсутствовала возможность использования списка аргументов с такими методами, как метод форматирования класса MessageFormat, или с новым методом JDK 5.0 printf класса PrintStream, для добавления дополнительных аргументов к строке форматирования. Старый способ использования списков аргументов описан в совете Using Variable Argument Lists от 4 февраля 2003 года.
В JDK 5.0 добавлен гибкий механизм работы с переменным количеством агрументов. Для изучения возможностей данного механизма, давайте рассмотрим версию метода printf класса PrintStream, используемую в JDK 5.0:
Описание данного метода приводится в совете Formatting Output With the New Formatter, опубликованном в октябре 2004 года.
По умолчанию, первым аргументом данного метода является строка, заполненная символами, определяющими последующие аргументы. Многоточие во втором аргументе показывает, что он может быть представлен в виде массива или последовательности аргументов. Заметьте, что применение символа многоточия аналогично применению данного символа с языках С и С++ для определения списка аргументов.
Количество символов-заполнителей в строке форматирования задает число передаваемых аргументов. Например, строка форматирования: «Hello, %1s\nToday is %2$tB %2$te, %2$tY» , требует наличия двух аргументов — первый строкового типа и второй типа дата. Ниже приводится пример использования данного метода:
public class Today public static void main ( String args []) System.out.printf ( «Hello, %1s%nToday is %2$tB %2$te, %2$tY%n» , args [ 0 ] ,
new Date ()) ;
>
>
Если в качестве аргумента вы зададите имя, то результат выполнения данного примера будет следующим:
> java Today Ed Hello, Ed Today is October 18, 2005
Автоматическое преобразование типов позволяет вам передвать в качестве аргументов примитивные типы (как в следующем примере метода printf ):
System.out.printf("Pi is approximately %f", Math.PI, %n);
В данном примере аргумент Math.PI имеет тип double . Автоматическое преобразование типов переводит его в объект типа Double . (Подробное описание автоматического преобразования типов дается с совете Introduction to Autoboxing от 5 апреля 2005 года).
При создании собственных методов, принимающих переменное количество элементов, учтите, что только последний аргумент метода может принимать переменное количество элементов. Вы не можете задавать аргумент с переменным количеством элементов первым. Например, следующее определение метода является верным. В нем определяется метод принимающий один параметр, являющийся набором аргументов типа String :
Параметр с перемнным числом аргументов не обязательно является единственным, передаваемым методу. Например, следующий метод принимает целочисленный агргумент, а затем пременное число аргументов.
При помещении вышеприведенных методов в класс, вы можете вызывать их, передавая переменное число аргументов:
method1 ( «Hello» , «World» ) ;
method1 ( args ) ;
method2 ( 12 , ‘a’ , «Hello» , Math.PI, 1 / 3.0 ) ;
method2 ( 18 , 94.0 ) ;
Во втором вызове метода есть небольшое отличие. Метод принимает аргумент String[] , передаваемый из метода main() . Так как механизм работы с переменным количеством агрументов, неявно является способом для создания и передачи массивов, то с его помощью массив может быть передан напрямую. В данном случае компилятор передает неизмененный массив.
Ниже приводится класс MyArgs, реализующий два типа методов:
public class MyArgs public static void main ( String args []) method1 ( «Hello» , «World» ) ;
method1 ( args ) ;
method2 ( 12 , ‘a’ , «Hello» , Math.PI, 1 / 3.0 ) ;
method2 ( 18 , 94.0 ) ;
>
private static void method1 ( String. args ) System.out.println ( Arrays.asList ( args ) + » // » + args.length ) ;
>
private static void method2 ( int arg, Object. args ) System.out.println ( Arrays.asList ( args ) + » / » + arg ) ;
>
>
Результат его выполнения буде следующим:
> java MyArgs x y z [Hello, World] // 2 [x, y, z] // 3 [a, Hello, 3.141592653589793, 0.3333333333333333] / 12 [94.0] / 18
Класс MyArgs получает доступ к списку аргументов, передавая его методу Arrays.asList() . То есть, доступ к аргументам производится также как к элементам массива. В обычной практике вы скорее всего будете использовать расшириный цикл for для доступа к аргументам:
Данный код позволяет поочередно обрабатывать каждый элемент.
Как видите, механизм работы с переменным количеством агрументов позволяет вам легко сохдавать методы, принимающие пременное количество аргументов. Для более полного ознакомления с данным механизмом обращайтесь к статье Varargs .
A может Вас также заинтересует что-нибудь из этого:
Java varargs
Сегодня мы обсудим такую штуку как varargs в Java. Varargs — или Variable Arguments — это технология, которая позволяет создавать методы с произвольным количеством аргументов. В данной статье мы научимся создавать такие методы, обсудим, зачем нужны varargs и когда их лучше использовать.
Что такое varargs?
Varargs — это аргументы переменной длины: фича, которая появилась еще в JDK5. Varargs позволяют нам создавать методы с произвольным количеством аргументов. По большому счету, создавать такие методы можно было и раньше. Правда, делать это было не очень удобно. Приведем пример. Допустим, нам необходимо написать метод, который будет принимать произвольное количество целочисленных аргументов и складывать их вместе. У нас есть два варианта. Вариант 1 — перегрузка:
class Calculator < int sum(int a, int b); int sum(int a, int b, int c); int sum(int a, int b, int c, int d); int sum(int a, int b, int c, int d, int e); >
Но с перегрузкой возникают две проблемы. Во-первых, не всегда понятно, когда пора остановиться, а во-вторых, это громоздко. Лучше уж массивы. Вариант 2 — массивы:
С массивом уже не громоздко, и вроде бы массив выглядит ничего так… до тех пор, пока не придет пора вызвать метод:
public static void main(String. sss)
Согласны, можно, конечно, и короче все записать. Но во-первых, хочется все-таки продемонстрировать неудобство использования массивов в качестве аргументов переменной длины, а во-вторых, даже если мы запишем так:
int[] arguments = ; int sum = calculator.sum(arguments);
То мы все равно не избавимся излишнего количества кода. Однако с выходом Java 5 для решения этих проблем появилась фича Varargs. Она позволила передавать в методы произвольное количество аргументов. Выглядит это примерно так:
public class Calculator < public static void main(String. sss) < Calculator calculator = new Calculator(); int sum = calculator.sum(1,10,123,234,6234,12,8); >int sum(int. numbers) < return Arrays.stream(numbers).sum(); >>
Итак, резюмируем. Varargs — это аргументы переменной длины, фича, которая появилась с выходом Java 5. Далее более подробно рассмотрим некоторые правила работы с Varargs.
5 правил varargs
Правило 1. Vararg аргумент (или же аргумент переменной/произвольной длины) обозначается через троеточие следующим образом:
String. words Integer. numbers Person. people Cat. cats
void print(String. words) int sum(Integer. numbers) void save(Person. people) void feed(Cat. cats)
void print(String. words, String anotherWord) // - Так нельзя! void print(String. words, int someNumber) // - Так нельзя! void print(String anotherWord, String. words) // - Так можно void print(int someNumber, String. words) // - Так можно
Правило 5. Несмотря на то, что varargs являются массивами, при вызове метода, который принимает аргументы переменной длины, не обязательно создавать массив. Достаточно и даже желательно просто перечислить необходимые аргументы через запятую:
public class Main < public static void main(String. sss) < print("Как","же","прекрасно","изучать","Java"); >static void print(String. words) < for (int i = 0; i < words.length; i++) < System.out.println(words[i]); >> >
Примеры varargs
В примере ниже мы напишем метод, который принимает varargs состоящий из целых чисел и выводит на экран количество переданных элементов и их сумму. Передадим в этот метод и массив, и ряд целых чисел (оба варианта допустимы):
public static void main(String. sss) < int[] a = new int[100]; for (int i = 0; i < a.length; i++) < a[i] = i; >sum(a); sum(1,2,3,4,5,6,7,8,9,10); > static void sum(int. numbers)
Кол-во элементов для сложения - 100, сумма - 4950 Кол-во элементов для сложения - 10, сумма - 55
Стоит сказать, что метод System.out.printf также принимает varargs. Если мы взглянем на код этого метода, то убедимся в этом:
public PrintStream printf(String format, Object . args)
public static String format(String format, Object. args)
Когда использовать varargs?
Ответ на этот вопрос зависит от того, кто спрашивает. Если подобный вопрос задает клиент некоторого API, в котором есть методы с varargs, то ответ будет “использовать такие методы как можно чаще”. Для клиента кода varargs существенно упрощает жизнь, облегчая написание кода и повышая его читаемость. Однако в случае, если данный вопрос задает разработчик API, который интересуется, как часто стоит создавать методы с varargs, то ответ будет “не следует часто использовать varargs”. Varargs следует использовать только тогда, когда выгода от его использования очевидна. Также не следует перегружать методы с varargs, так как это вызовет у клиентов вашего кода затруднения в понимании, какой из перегруженных методов в действительности вызывается.
Заключение
- Написать void метод, который принимает ряд целых чисел и возвращает их среднее арифметическое.
- Написать void метод, который принимает ряд строк и выводит на печать самое длинное слово.
- Написать метод, который возвращает boolean и принимает первым аргументом переменную типа String , а следующим аргументом ряд boolean , переменной длины.
Возможные значения String — AND , OR , XOR . В случае, если первый аргумент имеет какое то другое значение, метод должен бросить исключение IllegalArgumentException .
Метод должен осуществить логическую операцию (указанную в первом аргументе ) над каждым элементом varargs аргумента и вернуть результат вычисления.
- «AND», true, true, false — вернет false
- «OR», false, true, false, false — вернет true
Программирование на C, C# и Java
Уроки программирования, алгоритмы, статьи, исходники, примеры программ и полезные советы
ОСТОРОЖНО МОШЕННИКИ! В последнее время в социальных сетях участились случаи предложения помощи в написании программ от лиц, прикрывающихся сайтом vscode.ru. Мы никогда не пишем первыми и не размещаем никакие материалы в посторонних группах ВК. Для связи с нами используйте исключительно эти контакты: vscoderu@yandex.ru, https://vk.com/vscode
Переменное число аргументов в Java
В ряде случаев точное количество передаваемых аргументов методу заранее неизвестно. Такое может случится во время написания метода регистрации пользователя. Всегда существует ряд необязательных полей, которые пользователь может не ввести: пол, дату рождения и т. п. Программисту на Java справиться с данной проблемой поможет переменное число аргументов.
Конечно, существуют альтернативные пути решения проблемы, изложенной выше — их обычно и использовали до появления аргументов переменной длины (появились в JDK версии 5). Например, можно создать несколько перегруженных методов, охватывающих все ситуации, но данный способ не применим, когда максимальное количество аргументов велико. Другой способ — это передавать аргументы метода в виде массива элементов. Оба данных приёма не идеальны и не применимы в ряде случаев.
Определение метода с переменным числом аргументов
Для того, чтобы задать переменное число аргументов в методе на языке Java используется оператор многоточие (…). Например, если необходимо задать в методе аргумент переменной длины типа double, то нужно использовать следующую конструкцию: