Как передать параметры в метод Java
Вы можете передавать параметры в свои методы Java, чтобы что-то можно было сделать со значением этого параметра. Эти параметры находятся в круглых скобках метода.
Параметр — это технический термин для значения в круглых скобках заголовков метода. Вернитесь к своему классу MyMethods из урока Как вызвать метод в Java. Теперь добавьте второй метод total (выделен синим цветом):
package prjmethods; public class MyMethods int total() int a_Value = 10 + 10; return a_Value; > void print_text() System.out.println("Здесь какой-то текст"); > int total(int aNumber) int a_Value = aNumber + 20; return a_Value; > >
Теперь у нас есть два метода с одинаковым именем: total. Разница между ними заключается в том, что наш новый метод имеет параметр в круглых скобках. Java позволяет вам это делать, и это называется перегрузкой методов. Можно иметь столько методов с тем же именем, сколько нужно, с любым возвращаемым значением. Тем не менее, нельзя иметь одинаковый тип переменных в круглых скобках. То есть, у вас не может быть двух методов total, которые возвращают значения int, причем оба имеют значения int в круглых скобках. Вы не можете сделать, например, так: int total (int aNumber) int a_Value = aNumber + 20; return a_Value;
> int total (int aNumber) int a_Value = aNumber + 50; return a_Value;
> Несмотря на то, что эти два метода выполняют разные функции, они имеют одинаковые заголовки методов. Прежде чем попробовать новый метод с передачей параметра, добавьте несколько комментариев прямо над ним:
/**
* Returns an Integer value, which is
* 20 plus the number passed as a parametr.
* @param aNumber Any Integer value
* @return 20 + the value of aNumber */ int total(int aNumber) int a_Value = aNumber + 20; return a_Value; >
Вы заметите, что комментарии делаются достаточно просто. Но param в комментариях выше является сокращением для parameter. Наш параметр называется aNumber, и он имеет целочисленное значение. Обратите внимание на использование символа @ перед param и return. То, что мы делаем с самим методом, это передача ему целочисленного значения (значение Integer) и добавление 20 к этому переданному параметру. Теперь вернитесь к коду во вкладке TestMethods и добавьте следующую строку:
int aVal2 = test1.total(30);
Как только вы введете точку после объекта test1, вы снова увидите всплывающий список. В нем будет наш новый метод total. Нажмите на него, чтобы выделить, и NetBeans отобразит следующее: Добавленные нами комментарии теперь отображаются в синем поле под списком методов. Если кто-то будет писать в вашей созданной программе Java, он должен иметь возможность выяснить, что делает этот метод. Строки @param и @return из комментариев теперь заполнены и выделены жирным шрифтом. Дальше в круглых скобках введите число 30. Затем поставьте точку с запятой, чтобы закончить строку. Ваш метод main теперь должен выглядеть так:
package prjmethods; public class TestMethods public static void main(String[] args) MyMethods test1 = new MyMethods(); int aVal = test1.total(); System.out.println("Результат метода color: #d2cd86;">+ aVal); test1.print_text(); int aVal2 = test1.total(30); > >
Число 30 в круглых скобках нового метода total — это параметр этого метода, который мы будем передавать и помещать в переменную aNumber, находящуюся в круглых скобках заголовка метода: Как только вы передадите параметр, метод в нашей программе Java сможет приступить к работе. Добавьте строку печати в свой код:
System.out.println("Результат метода 2 color: #d2cd86;">+ aVal2);
System.out.println («Метод result2 Передача параметров результат» src=»../../../img/peredacha-parametrov-resultat.gif» alt=»Передача параметров результат» /> Таким образом, мы передали параметр aNumber в виде числа 30, дальше наш новый метод total добавил эти 30 к 20, а затем вернул ответ в переменную с именем aVal2. Итак, мы знаем, как передать один параметр в Java. На следующем уроке вы узнаете, как передать более одного параметра в метод Java.
Как передать несколько параметров в метод Java
Вы можете передать несколько параметров своим методам Java. В этом уроке мы будем передавать строку и число в один метод. Заключительный урок по методам.
Добавьте следующий метод в свой класс MyMethods из предыдущего урока:
void print_text(String aString, int aVal) System.out.println(aString + aVal); >
То, что делает этот метод — это выводит на печать. В круглых скобках имени метода у нас есть два параметра: переменная String с именем aString и переменная int с именем aVal. Когда мы вызываем этот метод, сначала нам понадобится строка, а затем число. Попробуйте передать эти несколько параметров наоборот, и вы получите сообщения об ошибках. Вернитесь в свой класс TestMethods и выполните следующий вызов метода:
test1.print_text("Параметр был: ", aVal2);
Опять же, метод print_text должен появиться во всплывающем списке NetBeans. Указанные нами значения (параметры) заключены в круглые скобки вместе с методом возврата void. Теперь окно с кодом должно выглядеть так:
package prjmethods; public class TestMethods public static void main(String[] args) MyMethods test1 = new MyMethods(); int aVal = test1.total(); System.out.println("Результат метода color: #d2cd86;">+ aVal); test1.print_text(); int aVal2 = test1.total(30); System.out.println("Результат метода 2 color: #d2cd86;">+ aVal2); test1.print_text("Параметр был: ", aVal2); > >
Два параметра, которые мы передаем, разделяются запятой. Обратите внимание, что передается значение aVal2. Однако имя переменной внутри круглых скобок print_text называется aVal. Не имеет значения, что имена двух переменных разные. Мы все равно передадим этот параметр в метод. Таким образом, переменная aVal будет иметь то же значение, что и aVal2. Когда вы запустите свою программу, вы должны увидеть следующее в окне вывода: Пока мы остановимся на этом по методам. По мере продвижения мы будем писать больше методов, то есть вы получите много практики. Следующий раздел о классах — объектно-ориентированное программирование.
Передача лямбда-выражения в метод в качестве параметра. Примеры
Лямбда-выражение может быть передано в метод в качестве аргумента. Объявление такого метода должно содержать ссылку на соответствующий функциональный интерфейс. Эта ссылка получается параметром метода, который обрабатывает лямбда-выражение.
Существует два способа передачи лямбда-выражения в метод:
- непосредственная передача лямбда-выражения. Этот способ хорошо подходит для лямбда-выражений с малым количеством операторов;
- передача ссылки на функциональный интерфейс, который связан с лямбда-выражением. В этом случае предварительно объявляется ссылка на интерфейс. Затем этой ссылке присваивается код лямбда-выражения. Этот способ уместен, когда лямбда-выражение становится слишком длинным для встраивания в вызов метода.
2. Пример, демонстрирующий способы передачи лямбда-выражения в метод
Пусть требуется передать в метод лямбда-выражение, которое находит среднее арифметическое трех чисел. Для этого выполняется следующая последовательность шагов.
Способ 1. Сначала объявляется функциональный интерфейс IAverage , содержащий метод, который получает три параметра и возвращает результат типа double
// Интерфейс, объявляющий метод вычисления // среднего арифметического из 3-х чисел. interface IAverage < double Avg(double a, double b, double c); >
Следующим шагом нужно объявить метод, который будет получать ссылку на интерфейс IAverage в качестве параметра. Этот метод может быть размещен в некотором классе как показано ниже
// Класс, содержащий реализацию метода, // который получает параметром ссылку на интерфейс IAverage class SomeClass < // Метод, который выводит на экран среднее арифметическое трех чисел. // Метод получает ссылку на функциональный интерфейс IAverage. // Программный код вычисления среднего арифметического формируется // в лямбда-выражении, которое передается аргументом в этот метод. public void PrintAverage(IAverage ref) < System.out.println("ref color: #0000ff;">main()) нужно передать соответствующее лямбда выражение в метод PrintAverage() примерно следующим образом:. public static void main(String[] args) < // Клиентский код - демонстрирует передачу в метод лямбда-выражения // 1. Создать экземпляр класса SomeClass SomeClass obj = new SomeClass(); // 2. Вызвать метод PrintAverage() и передать ему лямбда-выражение obj.PrintAverage((a,b,c) -> (a+b+c)/3.0); > .Способ 2. При этом способе предварительно формируется ссылка на интерфейс. Затем этой ссылке присваивается лямбда-выражение. После этого эта ссылка передается в метод PrintAverage() . Такой подход полезен, когда код лямбда-выражения слишком большой и усложняет восприятие вызова метода. Далее приведен измененный код предыдущего примера.
. public static void main(String[] args) < // Клиентский код - демонстрирует передачу в метод лямбда-выражения // 1. Объявить ссылку на интерфейс IAverage IAverage ref; // 2. Присвоить ссылке на интерфейс IAverage // лямбда-выражение, вычисляющее среднее арифметическое 3-х значений ref = (a, b, c) -> (a+b+c)/3.0; // 3. Создать экземпляр класса SomeClass SomeClass obj = new SomeClass(); // 4. Вызвать метод PrintAverage() obj.PrintAverage(ref); >3. Примеры решения задач, в которых лямбда-выражение передается в качестве аргумента метода
3.1. Максимальное значение в массиве чисел. Шаблонный функциональный интерфейс. Передача лямбда-выражения в статический метод
Условие задачи. Разработать лямбда-выражение, которое находит максимальное значение в массиве чисел, имеющих некоторый числовой тип T . Реализовать передачу лямбда-выражения в статический метод. В методе вывести максимальное значение на экран.
Решение. В задаче объявляется обобщенный (шаблонный) функциональный интерфейс IArray . В интерфейсе определен один метод, который получает массив чисел типа T и возвращает значение типа T .
Класс Lambda является основным классом в программе, который содержит функцию main() . В функции main() формируются:
- лямбда-выражение, вычисляющее максимальное значение в массиве A , которое является входным параметром. Следует обратить внимание, что массив A указывается параметром лямбда-выражения без скобок [ ] ;
- массив целых чисел, который передается в статический метод Solution() .
С целью демонстрации, в классе Lambda реализовано статический шаблонный метод Solution() , который получает два параметра:
- массив обобщенного типа T , в котором нужно найти максимальный элемент;
- лямбда-выражение, которое передается в метод как ссылка ref на функциональный интерфейс IArray .
Текст решения задачи следующий
// Функциональный интерфейс IArray interface IArrayextends Number> < // Метод поиска максимума в массиве чисел T Max(T[] array); > // Класс, содержащий методы, реализующие лямбда-выражение и // тестирующие работу программы. public class Lambda < // Статический шаблонный метод, получающий параметром лямбда-выражение. // Метод оперирует типом T. // Тип T ограничен типом Number - это значит, что тип T может // быть только числовым типом (double, float, int, . ). // Параметры метода: // - массив чисел типа T; // - ссылка на интерфейс IArray, в котором реализовано лямбда-выражение. public static extends Number> void Solution(T[] array, IArray ref) < // Вывести максимальное значение в массиве T max = ref.Max(array); System.out.println("max color: #800080;">public static void main(String[] args) < // Сформировать лямбда-выражение, вычисляющее максимальное значение // в массиве целых чисел IArray refInt = (A) -> < Integer max = A[0]; for (int i=0; iif (maxreturn max; >; // Создать массив целых чисел Integer[] A = < 7, 3, 2, 8, 8, 4 >; // Передать лямбда-выражение в метод Solution() Lambda.Solution(A, refInt); // max = 8 > >
Результат работы программы
max = 8
3.2. Сортировка массива строк методом вставки. Алгоритм сортировки передается лямбда-выражением
В примере демонстрируется использование лямбда-выражения для сортировки массива строк методом вставки.
// Функциональный интерфейс, предназначенный // для сортировки массива строк interface ISortStrings < void Sort(String[] array); > // Класс, содержащий метод, в который передается лямбда-выражение class SortMethods < // Метод, который сортирует и выводит отсортированные строки. // В метод передается лямбда-выражение в виде ссылки ref. void SortStrings(String[] AS, ISortStrings ref) < // Отсортировать массив AS ref.Sort(AS); // Вывести отсортированный массив for (String s : AS) System.out.println(s); > > public class Lambda2 < public static void main(String[] args) < // 1. Объявить ссылку на ISortStrings ISortStrings ref; // 2. Определить лямбда-выражение для алгоритма сортировки вставками. // Сортировка происходит по возрастанию: A. Z ref = (s) -> < String tmp; for (int i=0; ilength-1; i++) for (int j=i; j>=0; j--) if (s[j].compareTo(s[j+1])>0) < tmp = s[j]; s[j] = s[j+1]; s[j+1] = tmp; >>; // 3. Сформировать тестирующий массив строк String[] AS = < "afd", "jkl", "jprst", "mno", "axf", "aaa", "bcd", "ghi" >; // 4. Вызвать метод сортировки SortMethods() и передать ему лямбда-выражение SortMethods obj = new SortMethods(); // создать экземпляр класса obj.SortStrings(AS, ref); > >
Результат выполнения программы
aaa afd axf bcd ghi jkl jprst mno
3.3. Вычисление количества вхождений элемента в массиве. Обобщенный функциональный интерфейс
Реализовать лямбда-выражение, которое определяет количество вхождений элемента в массиве. Лямбда-выражение реализует обобщенный функциональный интерфейс.
Реализовать метод класса, который получает лямбда-выражение в качестве параметра и выводит количество вхождений элемента в массиве.
Продемонстрировать работу метода в функции main() .
Связанные темы
- Лямбда-выражения. Основные понятия. Функциональный интерфейс. Примеры
- Лямбда-выражения для обобщенных функциональных интерфейсов
- Генерирование исключений в лямбда-выражениях. Примеры
- Доступ к элементам класса в лямбда-выражениях. Захват переменных в лямбда-выражениях. Примеры
Передача метода в качестве параметра в java
Читал новые фичи в java 8, но так и не понял, можно ли в java передать метод в качестве параметра другому методу?
Отслеживать
задан 12 сен 2015 в 15:02
305 1 1 золотой знак 2 2 серебряных знака 11 11 бронзовых знаков
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Насколько я понимаю, речь всё-таки не о лямбда-выражениях, а о ссылках на методы (method references). Они ходят рядом с лямбда-выражениями, но всё же это отдельная штука.
Предположим, у вас есть метод, которому зачем-то посреди работы нужно преобразование строки в строку. Для этого можно воспользоваться готовым функциональным интерфейсом UnaryOperator :
public void myMethod(UnaryOperator stringTransformer) < // где-то в середине метода, возможно даже в цикле String transformedString = stringTransformer.apply(str); . >
Теперь в этот метод вы можете передать ссылки на подходящие методы. Тут подходят некоторые методы класса String , которые не принимают аргументов и возвращают новую строку. Например, можно вызвать так:
myMethod(String::trim);
myMethod(String::toUpperCase);
Тогда, когда вы вызываете stringTransformer.apply(str) , это волшебным образом превратится в str.trim() или str.toUpperCase() .
Ещё тут вариант — передать ссылку на статический метод с одним параметром. Например, у вас в проекте есть такое:
public class StringUtils < public static String removeDots(String str) < return str.replace(".", ""); >>
Тогда вы можете и ссылкой на такой метод воспользоваться:
myMethod(StringUtils::removeDots);
И stringTransformer.apply(str) волшебным образом превратится в StringUtils.removeDots(str) . Ещё можно сделать instance-bound ссылку, привязанную к конкретному объекту. Например:
myMethod(Pattern.compile("foo").matcher("[foo]")::replaceFirst);
Тут уже stringTransformer.apply(str) волшебным образом возьмёт str в квадратные скобки (а точнее — заменит в [foo] подстроку foo на str ).
Есть ещё ссылки на методы, создающие объект (типа ArrayList::new ) или массив (типа int[]::new ). В этом случае функциональный интерфейс должен соответствовать параметрам конструктора (в случае массива подразумевается один целый параметр — его длина). Ссылки на методы — мощная и красивая штука, но нередко всё-таки нужно полноценное лямбда-выражение. Например, последний пример яснее написать так:
myMethod(str -> "["+str+"]");