Как передать метод java
Перейти к содержимому

Как передать метод java

  • автор:

Как передать параметры в метод Java

Вы можете передавать параметры в свои методы 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. В этом уроке мы будем передавать строку и число в один метод. Заключительный урок по методам.

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+"]"); 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *