Ссылки на методы
Что такое «ссылка на метод»?
Ссылка на метод (Method reference) в Java представляет собой компактный способ передать ссылку на существующий метод вместо явного написания лямбда-выражения. Она используется для передачи метода как параметра в функции или для создания экземпляра функционального интерфейса.
-
Ссылка на статический метод:
-
Пример:
ClassName::staticMethodName. -
Используется для вызова статического метода класса.
-
-
Ссылка на метод экземпляра объекта:
-
Пример:
objectInstance::instanceMethodName. -
Используется для вызова метода конкретного объекта.
-
-
Ссылка на метод экземпляра по ссылке класса:
-
Пример:
ClassName::instanceMethodName. -
Для ClassName::instanceMethodName получателем становится первый аргумент функционального интерфейса, остальные передаются методу. Например, String::toUpperCase соответствует s -> s.toUpperCase().
-
Какие виды ссылок на методы вы знаете?
В Java существует несколько видов ссылок на методы, которые позволяют передавать методы как параметры или использовать их в функциональных интерфейсах более компактным способом, чем лямбда-выражения.
Основные виды ссылок на методы:-
Ссылка на статический метод:
-
Это ссылка на статический метод класса.
-
Синтаксис:
ClassName::staticMethodName. -
Пример: Здесь
Output::printMessage— это ссылка на статический методprintMessageклассаOutput.interface Printer { void print(String message); } class Output { public static void printMessage(String message) { System.out.println(message); } } public class Main { public static void main(String[] args) { Printer printer = Output::printMessage; printer.print("Hello, world!"); } }
-
-
Ссылка на метод экземпляра объекта:
-
Это ссылка на метод экземпляра конкретного объекта.
-
Синтаксис:
objectInstance::instanceMethodName. -
Пример: Здесь
person::printName— это ссылка на методprintNameобъектаperson.interface Printer { void print(String message); } class Person { public void printName(String name) { System.out.println("Name: " + name); } } public class Main { public static void main(String[] args) { Person person = new Person(); Printer printer = person::printName; printer.print("John Doe"); } }
-
-
Ссылка на метод экземпляра по ссылке класса:
-
Это несвязанная ссылка на метод экземпляра: объект-получатель передаётся первым аргументом при вызове функционального интерфейса.
-
Синтаксис:
ClassName::instanceMethodName. -
Ниже processor::convertToUpper показывает связанную ссылку на конкретный объект. Для несвязанной ссылки можно написать Function<String, String> upper = String::toUpperCase; и вызвать upper.apply(“hello”).
interface Processor { String process(String input); } class TextProcessor { public String convertToUpper(String input) { return input.toUpperCase(); } } public class Main { public static void main(String[] args) { TextProcessor processor = new TextProcessor(); Processor myProcessor = processor::convertToUpper; String result = myProcessor.process("hello"); System.out.println(result); } }
-
-
Ссылка на конструктор:
-
Это ссылка на конструктор класса.
-
Синтаксис:
ClassName::new. -
Пример: Здесь
MyClass::new— это ссылка на конструктор классаMyClass.interface MyFactory { MyClass create(String name, int value); } class MyClass { private String name; private int value; public MyClass(String name, int value) { this.name = name; this.value = value; } public String getName() { return name; } public int getValue() { return value; } } public class Main { public static void main(String[] args) { MyFactory factory = MyClass::new; MyClass instance = factory.create("example", 42); System.out.println("Name: " + instance.getName()); System.out.println("Value: " + instance.getValue()); } }
-