java передача метода как параметра
Java передача метода как параметра
Лямбды как параметры методов
Одним из преимуществ лямбд в java является то, что их можно передавать в качестве параметров в методы. Рассмотрим пример:
То есть в данном случае все числа должны быть четными или остаток от их деления на 2 должен быть равен 0. Затем это лямбда-выражение передается в вызов метода sum.
При этом можно не определять переменную интерфейса, а сразу передать в метод лямбда-выражение:
Ссылки на метод как параметры методов
Начиная с JDK 8 в Java можно в качестве параметра в метод передавать ссылку на другой метод. В принципе данный способ аналогичен передаче в метод лямбда-выражения.
Ссылка на метод передается в виде имя_класса::имя_статического_метода (если метод статический) или объект_класса::имя_метода (если метод нестатический). Рассмотрим на примере:
Здесь также определен функциональный интерфейс Expression, который имеет один метод. Кроме того, определен класс ExpressionHelper, который содержит два статических метода. В принципе их можно было определить и в основном классе программы, но я вынес их в отдельный класс.
При втором вызове метода sum отдельно создается объект Expression, который затем передается в метод:
Использование ссылок на методы в качестве параметров аналогично использованию лямбда-выражений.
Если нам надо вызвать нестатические методы, то в ссылке вместо имени класса применяется имя объекта этого класса:
Ссылки на конструкторы
При использовании конструкторов методы функциональных интерфейсов должны принимать тот же список параметров, что и конструкторы класса, и должны возвращать объект данного класса.
Лямбды как результат методов
Также метод в Java может возвращать лямбда-выражение. Рассмотрим следующий пример:
В данном случае определен функциональный интерфейс Operation, в котором метод execute принимает два значения типа int и возвращает значение типа int.
Метод action принимает в качестве параметра число и в зависимости от его значения возвращает то или иное лямбда-выражение. Оно может представлять либо сложение, либо вычитание, либо умножение, либо просто возвращает 0. Стоит учитывать, что формально возвращаемым типом метода action является интерфейс Operation, а возвращаемое лямбда-выражение должно соответствовать этому интерфейсу.
Либо можно сразу получить и тут же выполнить лямбда-выражение:
Java: передача параметров по значению или по ссылке
Простое объяснение принципов передачи параметров в Java.
Многие программисты часто путают, какие параметры в Java передаются по значению, а какие по ссылке. Давайте визуализируем этот процесс, и тогда вы увидите насколько все просто.
Данные передаются между методами через параметры. Есть два способа передачи параметров:
Передача по значению (by value). Значения фактических параметров копируются. Вызываемый метод создает свою копию значений аргументов и затем ее использует. Поскольку работа ведется с копией, на исходный параметр это никак не влияет.
Передача по ссылке (by reference). Параметры передаются как ссылка (адрес) на исходную переменную. Вызываемый метод не создает свою копию, а ссылается на исходное значение. Следовательно, изменения, сделанные в вызываемом методе, также будут отражены в исходном значении.
В Java переменные хранятся следующим образом:
Локальные переменные, такие как примитивы и ссылки на объекты, создаются в стеке.
Объекты — в куче (heap).
Теперь вернемся к основному вопросу: переменные передаются по значению или по ссылке?
Java всегда передает параметры по значению
Чтобы разобраться с этим, давайте посмотрим на пример.
Пример передачи примитивов по значению
Поскольку Java передает параметры по значению, метод processData работает с копией данных. Следовательно, в исходных данных (в методе main ) не произошло никаких изменений.
Теперь рассмотрим другой пример:
Передача объекта
Что здесь происходит? Если Java передает параметры по значению, то почему был изменен исходный список? Похоже, что Java все-таки передает параметры не по значению? Нет, неправильно. Повторяйте за мной: «Java всегда передает параметры по значению».
Чтобы с этим разобраться, давайте посмотрим на следующую диаграмму.
Память стека (stack) и кучи (heap)
Давайте посмотрим на еще один пример:
Передача объекта по ссылке
Память стека (stack) и кучи (heap)
Итак, Java всегда передает параметры по значению. Однако мы должны быть осторожны при передаче ссылок на объекты.
Вышеприведенная концепция очень важна для правильного решения ваших задач.
Например, рассмотрим удаление узла в односвязном списке.
Удаление узла в связанном списке
Это решение работает во всех случаях, кроме одного — когда вы удаляете первый узел ( Position = 1 ). Основываясь на ранее описанной концепции, видите ли вы в чем здесь проблема? Возможно, поможет следующая диаграмма.
Удаление первого узла односвязного списка
Для исправления алгоритма необходимо сделать следующее:
В этой статье мы обсудили одну небольшую, но важную концепцию Java: передачу параметров.
Подробнее о курсе и программе обучения можно узнать на бесплатном вебинаре, который пройдет 15 апреля.
Java передать метод в качестве параметра
Я ищу способ передать метод по ссылке. Я понимаю, что Java не передает методы в качестве параметров, однако я хотел бы получить альтернативу.
То, что я хотел бы сделать, это что-то похожее на это:
16 ответов
Возможный Дубликат : Java передать метод в качестве параметра Можно ли передать метод в качестве параметра в Java? Если я не могу, то каков был бы наилучший курс действий для приведенного ниже метода без необходимости повторять код. public void enterUserInput(javax.swing.JTextField inputField.
В Java 8 теперь вы можете более легко передать метод, используя выражения Lambda и ссылки на методы. Во-первых, некоторая предыстория: функциональный интерфейс-это интерфейс, который имеет один и только один абстрактный метод, хотя он может содержать любое количество методов по умолчанию (новый в Java 8) и статических методов. Выражение lambda может быстро реализовать абстрактный метод без всего ненужного синтаксиса, необходимого, если вы не используете выражение lambda.
Без выражений lambda:
С выражениями lambda:
Синтаксис выражений Lambda
Выражение lambda состоит из следующего:
Разделенный запятыми список формальных параметров,заключенный в круглые скобки. Метод CheckPerson.test содержит один параметр p, который представляет экземпляр класса Person.
Примечание : Вы можете опустить тип данных параметров в выражении lambda. Кроме того, вы можете опустить скобки, если есть только один параметр. Например, также допустимо следующее выражение lambda:
Тело, состоящее из одного выражения или блока операторов. В этом примере используется следующее выражение:
Если вы укажете одно выражение, то среда выполнения Java вычислит это выражение, а затем вернет его значение. Кроме того, вы можете использовать оператор return:
Оператор return не является выражением; в выражении lambda операторы должны заключаться в фигурные скобки (<>). Однако вам не нужно заключать вызов метода void в фигурные скобки. Например, ниже приведено допустимое выражение lambda:
Обратите внимание, что выражение lambda очень похоже на объявление метода; вы можете рассматривать выражения lambda как анонимные методы—методы без имени.
Вот как вы можете «pass a method» использовать выражение lambda:
Класс C может быть сокращен еще немного, используя ссылки на методы, такие как:
Можно ли передать метод в качестве параметра методу? self.method2(self.method1) def method1(self): return ‘hello world’ def method2(self, methodToRun): result = methodToRun.call() return result
Начиная с Java 8 существует интерфейс Function ( docs ), который имеет метод
Вы можете использовать его для передачи функций в качестве параметров другим функциям. T-тип ввода функции, R-тип возврата.
Это выглядело бы так:
И вы бы назвали это использованием ссылок на методы:
Предполагая, что вы определили методы changeColor() и changeSize() в одном классе.
Используйте объект java.lang.reflect.Method и вызовите invoke
Сначала определите интерфейс с методом, который вы хотите передать в качестве параметра
Реализуйте класс с помощью метода
Это позволяет передать cmd в качестве параметра и вызвать вызов метода, определенного в интерфейсе
Оба варианта(lambda и ссылка на метод) требуют интерфейса, доступного с одним методом, подпись которого используется:
Имена методов с этого момента не будут иметь значения. Там, где принимается lambda, также используется ссылка на метод. Например, чтобы использовать нашу подпись здесь:
Это всего лишь простой вызов интерфейса, до тех пор, пока lambda 1 не будет передан:
Ссылки на методы аналогичны. Дано:
1 Некоторые не считают это lambda, так как у него есть побочные эффекты. Однако это иллюстрирует использование одного из них более straightforward-to-visualize.
В последний раз, когда я проверял, Java не способен изначально делать то, что вы хотите; вы должны использовать ‘work-arounds’, чтобы обойти такие ограничения. Насколько я понимаю, интерфейсы ARE-это альтернатива, но не очень хорошая альтернатива. Возможно, тот, кто сказал вам это, имел в виду что-то вроде этого:
Который вы затем вызовете с помощью:
Если вам не нужны эти методы для возврата чего-либо, вы можете заставить их возвращать выполняемые объекты.
Затем используйте его, как:
Я не нашел ни одного примера, достаточно явного для меня, о том, как использовать java.util.function.Function для простого метода в качестве функции параметра. Вот простой пример:
Который затем вернется в вывод:
Пример должен быть запущен как есть, затем вы можете попробовать более сложные вещи из приведенных выше ответов с различными классами и интерфейсами.
Java есть механизм для передачи имени и вызова его. Это часть механизма отражения. Ваша функция должна принимать дополнительный параметр метода класса.
Я не эксперт java, но я решаю вашу проблему вот так:
Я определяю параметр в своем специальном интерфейсе
Используйте шаблон наблюдателя (иногда также называемый шаблоном слушателя):
new ComponentDelegate(). объявляет анонимный тип, реализующий интерфейс.
Вот основной пример:
Я не нашел здесь никакого решения, которое показывало бы, как передать метод с привязанными к нему параметрами в качестве параметра метода. Ниже приведен пример того, как вы можете передать метод со значениями параметров, уже привязанными к нему.
Другой пример показывает, как передать метод, который на самом деле возвращает что-то
Пример решения с отражением, переданный метод должен быть общедоступным
Я ценю ответы выше, но мне удалось добиться того же поведения, используя метод ниже; идея заимствована из Javascript обратных вызовов. Я открыт для коррекции, хотя пока все так хорошо (в производстве).
Идея состоит в том, чтобы использовать возвращаемый тип функции в сигнатуре, а это означает, что выход должен быть статическим.
Ниже приведена функция, которая запускает процесс с таймаутом.
Похожие вопросы:
У меня есть строфа кода, который неоднократно используется. Вот два примера: public java.sql.Struct createStruct(String typeName, Object[] attributes) < String searchPath = getSearchPath(); String.
Я пишу программу и хочу знать, могу ли я передать метод в качестве параметра другого метода. Например, что-то из следующего: public boolean update(Method m)< //input is a method int i = m.execute();.
Возможный Дубликат : Java передать метод в качестве параметра Можно ли передать метод в качестве параметра в Java? Если я не могу, то каков был бы наилучший курс действий для приведенного ниже.
Можно ли передать метод в качестве параметра методу? self.method2(self.method1) def method1(self): return ‘hello world’ def method2(self, methodToRun): result = methodToRun.call() return result
Есть ли способ передать метод универсального типа в качестве параметра? То, что я пытаюсь достичь, это что-то вроде этого: ListUtils.mapObjectToField( entries, Contact.getZipCode ); Я передаю.
Итак, я изучаю Java, и у меня есть метод интерфейса, который требует суперкласса в качестве параметра. Я хотел бы передать дочерний класс в качестве параметра. Кто-нибудь знает простой способ.
Я хочу передать метод в качестве параметра в методе типа callMethod(someArg, methodToPass ) И в определении callMethod, я хочу назвать это клавиши Fn то есть. MethodToPass, то есть в другом файле.
Могу ли я передать метод как параметр другого метода в java?
Я пытаюсь измерить время выполнения для нескольких методов. поэтому я думал сделать метод вместо того, чтобы дублировать один и тот же код много раз.
6 ответов
методы не являются первоклассными объектами в Java, поэтому они не могут быть переданы как параметры. Вы можете использовать обертывание вызова метода в раздражающем классе, который расширяет, например, Runnable интерфейс:
самый простой способ сделать это-передавать интерфейс. Что-то вроде
и тогда у вас могут быть методы, которые принимают CommonFuncs в качестве аргумента. Реализации этих методов могут вызывать execute метод.
вы находитесь в правильном пути, вам нужно передать объект метода, целевой объект, на котором выполняется метод и аргументы, которые он принимает, а затем вызвать его в свой try catch, что-то вроде:
у меня есть счетчик вызовов объектов, который в основном выглядит так:
С двумя «время» методы синхронизации, которые возвращают что-то и другие методы, которые являются недействительными.
Я решил переосмыслить исключения как исключения во время выполнения (поскольку я не поклонник проверенных исключений), но вы также можете сделать свой пользовательский интерфейс MyRunnable исключениями и просто поймать и повторно бросить их. Вот использование вышеизложенного:
или это, в случае возвращаемого значения:
мне это нравится, потому что мои встречные объекты могут быть подвергнуты воздействию JMX и вводиться везде, где мне это нужно. Вы могли бы сделать то, что вы попросили, с размышлением, но я думаю, что это было бы грязно (ИМХО).
BestProg
Методы. Передача параметров в методах (функциях) класса. Передача переменных примитивных типов и объектов в метод в качестве параметра
Содержание
Поиск на других ресурсах:
1. Какие существуют способы передачи аргументов методу (функции)?
В Java существует 2 способа для передачи переменной или объекта класса в функцию:
Если методу передается аргумент примитивного типа, то происходит передача по значению. То есть, делается копия аргумента.
3. Каким образом в метод передается объект некоторого класса?
В отличие от переменных примитивных типов, объекты класса передаются по ссылке. Это значит, что изменения, сделанные в теле функции (методе) будут изменять также значения объекта, который задавался в качестве аргумента.
4. Примеры передачи переменных примитивных типов в методы (функции)
Демонстрация использования метода в другом методе:
Реализация метода имеет следующий вид:
Демонстрация использования метода Inc() в методе main() :
5. Пример передачи объекта класса в метод (функцию)
Программный код, который реализует класс Month следующий:
Кроме примитивных типов данных методы (функции) могут возвращать объекты класса. В этом случае, в теле метода выделяется память на объект класса. После использования этот объект возвращается из метода с помощью оператора return.
В вызывающей части программы не нужно выделять память для объекта, которому присваивается возвращаемое значение из функции. Это объясняется тем, что память для всех объектов в программе вызывается динамично. Пока существует ссылка на объект, он не уничтожается из памяти. Значит, при выполнении присваивания вида: