что такое метод референс java
BestProg
Ссылки на методы. Виды ссылок на методы. Ссылка на статический метод. Ссылка на метод экземпляра
Содержание
Поиск на других ресурсах:
1. Ссылки на методы. Связь лямбда-выражений со ссылками на методы. Виды ссылок на методы
Если лямбда-выражения связываются с функциональным интерфейсом, то методы также могут быть связаны с функциональным интерфейсом. Связь метода с функциональным интерфейсом осуществляется с помощью ссылки на метод.
Если лямбда-выражение может быть передано в некоторый метод как параметр, то ссылка на метод также может быть передана в качестве параметра. С помощью этой ссылки можно обращаться к методу не вызывая его.
В Java различают 4 вида ссылок на методы:
2. Ссылка на статические методы
2.1. Общая форма ссылок на статические методы. Разделитель ::
В языке Java можно объявлять ссылки на статические методы. Ссылка на статический метод может быть передана в некоторый метод и там использована для вызова статического метода.
Общая форма объявления ссылки на статический метод следующая:
Разделитель :: внедрен в версии JDK 8 для определения ссылки на метод.
Например. Если в классе A объявлен статический метод с именем Method()
то ссылка на этот метод будет следующей
2.2. Примеры ссылок на статические методы
2.2.1. Ссылка на статический метод вычисления объема шара
Условие задачи. Разработать статический метод, который получает радиус шара и вычисляет объем шара. Реализовать передачу метода вычисления объема шара в другой метод в качестве параметра. Провести тестирование метода.
Решение. При решении данной задачи нужно разработать следующие элементы:
Текст программы, решения данной задачи, следующий.
Результат выполнения программы
2.2.2. Ссылка на обобщенный статический метод реверсирования массива чисел
Решение. Последовательность шагов, которые нужно выполнить чтобы решить задачу:
Текст программы, решающий данную задачу, следующий
Результат выполнения программы
3. Ссылка на методы экземпляра
3.1. Общая форма ссылки на методы экземпляра
Чтобы объявить ссылку на метод экземпляра используется одна из двух общих форм:
В другом случае метод экземпляра указывается вмести з любым объектом данного класса, а не только с указанным объектом.
3.2. Примеры использования ссылок на методы экземпляра
3.2.1. Ссылка на методы, выполняющие действия над комплексными числами
Условие задачи. Продемонстрировать передачу в некоторый метод класса методов суммирования и вычитания комплексных чисел.
Решение. Для решения задачи в программе необходимо разработать следующие элементы (составляющие).
2. Функциональный интерфейс для оперирования типом Complex
3. Класс, содержащий собственно методы обработки комплексных чисел (суммирование, вычитание).
5. Класс, демонстрирующий использование ссылки на метод экземпляра
Ниже приведен текст решения задачи.
Результат выполнения программы
3.2.2. Ссылка на обобщенный метод экземпляра
Условие задачи. Реализовать класс, содержащий следующие обобщенные (шаблонные) методы работы с массивами:
Продемонстрировать вызов методов обработки массивов используя способ передачи ссылки на метод экземпляра в качестве параметра.
Решение.
Разница в вызовах заключается в передаче первого параметра, которым есть ссылка на метод экземпляра. В первом случае передается метод экземпляра, который вычисляет среднее арифметическое по следующему синтаксису
В другом случае передается метод экземпляра
который вычисляет сумму.
После запуска на выполнение программа выдаст следующий результат
Получение Method из Method Reference в Java
Я столкнулся с проблемой — как получить из method reference вида
В общем, перебрав несколько вариантов, удалось найти тот, который не имеет этих изьянов и работает в поздних версиях JDK — SerializedLambda. Забегая вперед сразу скажу, что это работает только с функциональными интерфейсами, помеченными как java.io.Serializable (т.е. с java.util.function.Function работать не будет), но в целом это не проблемное ограничение.
Зачем вообще это нужно?
Перед тем как перейти к решению, отвечу на резонный вопрос а зачем это может понадобиться?
В моем случае это используется в тестовых фреймворках, чтобы добавить диагностическую информацию о вызываемом методе, который определялся через method reference. Это позволяет сделать одновременно лаконичный и compile-безопасный код. Например, можно сделать «where» hamcrest matcher, использующий функцию-extractor для значений:
SerializedLambda
Класс java.lang.invoke.SerializedLambda — это сериализованное представление лямбда-выражения. Важно уточнить, что интерфейс лямбда-выражения должен быть помечен как Serializable :
Остается только найти подходящий метод в интерфейсе, чтобы вернуть правильный результат:
А с конструкторами работает?
Совместимость
Это работает в Java 8, Java 11, Java 14, не требует внешних библиотек или доступа к приватным api JDK, не требует дополнительных параметров запуска JVM. Кроме того, применимо и к статическим методам и к методам с разным количеством аргументов (т.е. не только Function-подобные).
Единственное неудобство — для каждого вида функций придется создать сериализуемое представление, например:
Полную реализацию можно найти тут.
Готовый утилитарный метод
Вы можете скопировать класс в свой проект, но я бы не рекомендовал использовать это вне scope test. Кроме того, можно добавить зависимость: