java как передать метод в качестве параметра java
Java как передать метод в качестве параметра java
Лямбды как параметры методов
Одним из преимуществ лямбд в java является то, что их можно передавать в качестве параметров в методы. Рассмотрим пример:
То есть в данном случае все числа должны быть четными или остаток от их деления на 2 должен быть равен 0. Затем это лямбда-выражение передается в вызов метода sum.
При этом можно не определять переменную интерфейса, а сразу передать в метод лямбда-выражение:
Ссылки на метод как параметры методов
Начиная с JDK 8 в Java можно в качестве параметра в метод передавать ссылку на другой метод. В принципе данный способ аналогичен передаче в метод лямбда-выражения.
Ссылка на метод передается в виде имя_класса::имя_статического_метода (если метод статический) или объект_класса::имя_метода (если метод нестатический). Рассмотрим на примере:
Здесь также определен функциональный интерфейс Expression, который имеет один метод. Кроме того, определен класс ExpressionHelper, который содержит два статических метода. В принципе их можно было определить и в основном классе программы, но я вынес их в отдельный класс.
При втором вызове метода sum отдельно создается объект Expression, который затем передается в метод:
Использование ссылок на методы в качестве параметров аналогично использованию лямбда-выражений.
Если нам надо вызвать нестатические методы, то в ссылке вместо имени класса применяется имя объекта этого класса:
Ссылки на конструкторы
При использовании конструкторов методы функциональных интерфейсов должны принимать тот же список параметров, что и конструкторы класса, и должны возвращать объект данного класса.
Лямбды как результат методов
Также метод в Java может возвращать лямбда-выражение. Рассмотрим следующий пример:
В данном случае определен функциональный интерфейс Operation, в котором метод execute принимает два значения типа int и возвращает значение типа int.
Метод action принимает в качестве параметра число и в зависимости от его значения возвращает то или иное лямбда-выражение. Оно может представлять либо сложение, либо вычитание, либо умножение, либо просто возвращает 0. Стоит учитывать, что формально возвращаемым типом метода action является интерфейс Operation, а возвращаемое лямбда-выражение должно соответствовать этому интерфейсу.
Либо можно сразу получить и тут же выполнить лямбда-выражение:
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 описание и использование
Методы Java – это место, где вы помещаете операции с данными (переменными) в свой код. Другими словами, вы группируете операции (код) внутри них. Методы должны находиться внутри класса Java.
Похожи на то, что называется функциями или процедурами в других языках программирования (например, Pascal или JavaScript). Метод – это группа операторов, которые выполняют некоторую операцию с некоторыми данными и могут возвращать или не возвращать результат.
Вот простой пример:
В приведенном выше примере определяется метод с именем writeText внутри класса с именем MyClass. Метод принимает один параметр с именем text, который используется в операторе внутри метода, и не возвращает никакого значения.
Параметры метода
Параметры метода позволяют передавать значения в метод, с которым он может работать. Объявляются в скобках после имени метода:
Метод writeText в приведенном выше примере принимает два параметра: text1 и text2. Они имеют тип String, как написано перед каждым именем параметра.
Вы можете использовать любой примитивный тип данных или встроенный класс в качестве типа данных для параметров, в том числе свои собственные классы.
Параметры против переменных
Параметр метода похож на переменную. Вы можете прочитать его значение, а также изменить:
Предупреждение: хотя можно изменить значение параметров, вы должны быть осторожны, так как это может привести к путанице в коде. Если вы думаете, что справитесь с этим, продолжайте. Если нет, создайте локальную переменную для хранения значения и оставьте значение параметра без изменений.
Вызов метода writeText() выглядит следующим образом:
Обратите внимание, как параметры метода записываются в скобках после имени метода. Когда приведенный выше код выполняется, метод writeText() будет выполнен, а параметры содержать значения «Hello» и «World».
Конечные параметры
Параметр метода может быть объявлен как final, как переменная. Значение окончательного параметра не может быть изменено. То есть, если параметр является ссылкой на объект, ссылка не может быть изменена, но значения внутри объекта все еще могут быть изменены. Вот пример:
В этом примере метода вы не можете переназначить параметры text1 и text2 на любые другие строки, кроме тех, которые были переданы в качестве параметров при вызове.
Локальные
Вы можете внутри метода объявить локальные переменные. Они могут использоваться точно так же, как любая другая переменная, но доступна только внутри области действия метода. Вот пример:
Локальные переменные также могут быть объявлены как окончательные. Если вы объявите их как final, значение не может быть изменено. Если переменная является ссылкой на объект, то ее нельзя изменить, но значения внутри ссылочного объекта все еще можно изменить.
Тип возврата метода
Метод может вернуть значение:
Этот метод добавляет два переданных ему параметра и возвращает результат.
Вы можете вернуть любой примитивный тип или любой объект из метода. Вы также можете вернуть строку, например так:
Этот метод объединяет две строки, переданные в качестве параметров, и возвращает результат.
Возвращаемые
Допустимо иметь более одного оператора возврата в методе. Тем не менее, они не могут быть выполнены оба. После выполнения оператора return больше не выполняется код в этом методе. Программа просто возвращается к коду, который вызвал его.
Вот пример с несколькими операторами возврата:
Обратите внимание на оператор if внутри метода. Он проверяет, является ли логический параметр reverseOrder истинным или ложным.
Если параметр reverseOrder имеет значение true, то метод возвращает две строки, переданные как параметры, объединенные в обратном порядке (сначала строка2, затем строка1).
Если параметр reverseOrder имеет значение false, то метод пропускает тело оператора if. Затем он продолжается до второго оператора возврата, который возвращает два параметра, соединенных в обычном порядке (строка1, затем строка2).
Модификаторы доступа к методам
Возможно, вы заметили слово public, которое помещено перед всеми примерами объявления методов в этом тексте. Это слово является модификатором доступа для метода. Он определяет, какой код может вызывать этот метод.
Объявления об исключениях
Если внутри метода возникает ошибка, метод может вызвать исключение. Исключения должны быть объявлены в объявлении метода следующим образом(выделено жирным шрифтом):
Этот метод сначала проверяет, является ли один из двух параметров string1 или string2 нулевым. Если они есть, исключение выдается. Когда генерируется исключение, метод также прекращает выполнение. Но вместо возврата туда, откуда был вызван, выполнение возобновляется внутри первого предложения catch() <>, окружающего метод, нацеленного на это исключение.
Методы вызова
Вызов методов в нескольких местах:
Обратите внимание, как метод callSum() создает переменную с именем theSum и присваивает ей значение, возвращаемое вызовом метода add(1, 3). После этого он печатает значение.
Методы могут использоваться для разбиения кода на более мелкие, более понятные и повторно используемые сегменты кода, вместо того, чтобы писать свою программу как один большой метод.
Java – как передать метод в качестве параметра?
У меня есть строфа кода, который многократно используется. Вот два примера:
Вы можете видеть, что эти два метода имеют общий вид:
Где T – тип возврата некоторого набора функций createXXX которые имеют общую подпись, но имеют другой тип возврата.
Я почти уверен, как это сделать в Javascript, F #, С#, Scala или любом другом языке.
Я просто не могу оборачивать голову тем, как это сделать на Java, безопасным для типа, что позволяет мне вызвать каждый метод createXXX чтобы установка и createXXX могли произойти в одном блоке кода, а не посыпать по всему методу обертки.
Я знаю, что могу использовать рефлексию, но я ищу способ сделать это, используя lambdas, если это возможно, или какая-либо структура имеет наибольший смысл в Java.
Что-то вроде этого, когда метод, который будет вызываться, передается в качестве третьего параметра (я знаю, что этот код полностью искажен в Java):
Я прочитал, по-видимому, повторяющиеся вопросы:
Помимо некоторых вопросов о ссылках на методы с дженериками:
По какой-то причине это не грызет меня, поэтому я рискую задать вопрос, который сразу же будет отмечен как дубликат в надежде, что кто-то пожалеет и поможет мне…
Хотя и Луи Вассерман и Нейрон дали в основном тот же ответ, Луи, что более педантично предложил шаблон, который работал лучше всего для меня… с явным примером того, как передать ссылку на метод.
Здесь то, что в конечном итоге работает для меня:
Это называется так, как Луис предложил:
Вы можете решить эту проблему, передав объекты, которые имеют единственную цель выполнения одной функции. Вот вам небольшой пример, который дает вам идею. Создайте интерфейс для типа функции. Вы должны использовать дженерики, как я здесь:
Затем определите свой метод, который выполняет функции указанного вами типа:
Наиболее удобным способом являются анонимные классы, в которых вы определяете реализацию интерфейсов в строке:
Ответ Луи находится на правильном пути; однако мне не ясно, что delegate() будет доступен в точке, где вызывается метод create. Если он недоступен, вам понадобится метод с тремя аргументами.
В отличие от ответа Луи, вы должны определить свой собственный интерфейс здесь, потому что нет встроенного класса TriFunction в Java 8.
См. Раздел 15.13.3 JLS для полного описания того, как можно использовать ссылки на методы. Этот конкретный приведен в параграфе, начинающемся с “Если форма ReferenceType :: [TypeArguments] Identifier”.
EDIT: после другого взгляда на вопрос, я вижу, что createTypeWithCorrectSearchPath был предназначен для частного метода и не вызывался извне. Поэтому этот ответ, вероятно, неприменим. Я оставляю это здесь, потому что это может быть полезным ответом в некоторых подобных ситуациях.
Метод передачи Java как параметр
Ищу способ передать метод по ссылке. Я понимаю, что Java не передает методы в качестве параметров, однако хотелось бы получить альтернативу.
Я хотел бы сделать что-то похожее на это:
16 ответов
Начиная с Java 8 существует интерфейс Function (документы), у которого есть метод
Это выглядело бы так:
И вы бы назвали это, используя ссылки на методы:
Предполагая, что вы определили методы changeColor () и changeSize () в одном классе.
Используйте объект java.lang.reflect.Method и вызовите invoke
Сначала определите интерфейс с методом, который вы хотите передать в качестве параметра
Реализуйте класс с методом
Это позволяет вам передать cmd в качестве параметра и вызвать вызов метода, определенный в интерфейсе.
Хотя это еще не применимо для Java 7 и ниже, я считаю, что мы должны смотреть в будущее и, по крайней мере, признать изменения, которые появятся в новых версиях, таких как Java 8.
Для обоих вариантов (лямбда и ссылка на метод) требуется интерфейс, доступный с одним методом, подпись которого используется:
С этого момента названия методов не имеют значения. Там, где допускается лямбда, также можно использовать ссылку на метод. Например, чтобы использовать здесь нашу подпись:
Ссылки на методы аналогичны. Данный:
В прошлый раз, когда я проверял, Java изначально не способна делать то, что вы хотите; вы должны использовать «обходные пути», чтобы обойти такие ограничения. Насколько я понимаю, интерфейсы ЯВЛЯЮТСЯ альтернативой, но не хорошей альтернативой. Возможно, тот, кто вам это сказал, имел в виду что-то вроде этого:
Который вы затем вызываете с помощью:
Если вам не нужны эти методы для возврата чего-либо, вы можете заставить их возвращать объекты Runnable.
Затем используйте это как:
Я не нашел достаточно подробного для меня примера того, как использовать java.util.function.Function для простого метода в качестве функции параметра. Вот простой пример:
Что затем вернется на выходе:
Пример должен работать как есть, затем вы можете попробовать более сложные вещи из приведенных выше ответов с разными классами и интерфейсами.
В Java действительно есть механизм для передачи имени и вызова его. Это часть механизма отражения. Ваша функция должна принимать дополнительный параметр класса Method.
Используйте шаблон наблюдателя (иногда также называемый шаблоном слушателя):
new ComponentDelegate(). объявляет анонимный тип, реализующий интерфейс.
Вот простой пример:
Я не эксперт по java, но решаю вашу проблему так:
Я определяю параметр в моем специальном интерфейсе
Я не нашел здесь решения, показывающего, как передать метод с привязанными к нему параметрами в качестве параметра метода. Ниже показан пример того, как вы можете передать метод с уже привязанными к нему значениями параметров.
Другой пример показывает, как передать метод, который действительно что-то возвращает.
Пример решения с отражением, переданный метод должен быть публичным
Я ценю приведенные выше ответы, но я смог добиться того же поведения, используя метод ниже; идея, заимствованная из обратных вызовов Javascript. Я открыт для исправления, хотя пока все хорошо (в производстве).
Идея состоит в том, чтобы использовать в сигнатуре возвращаемый тип функции, что означает, что доходность должна быть статической.
Ниже приведена функция, запускающая процесс с тайм-аутом.
Синтаксис лямбда-выражений
Лямбда-выражение состоит из следующего:
Разделенный запятыми список формальных параметров, заключенный в круглые скобки. Метод CheckPerson.test содержит один параметр p, который представляет собой экземпляр класса Person.
Тело, состоящее из одного выражения или блока операторов. В этом примере используется следующее выражение:
Если вы указываете одно выражение, среда выполнения Java оценивает выражение и затем возвращает его значение. В качестве альтернативы, вы можете использовать оператор возврата:
Оператор возврата не является выражением; в лямбда-выражении операторы необходимо заключать в фигурные скобки (<>). Однако у вас нет чтобы заключить вызов метода void в фигурные скобки. Например, Ниже приводится допустимое лямбда-выражение:
Вот как можно «передать метод» с помощью лямбда-выражения:
Класс C можно еще немного сократить за счет использования таких ссылок на методы: