Перейти к содержимому
шпаргалка.
Esc
навигацияоткрыть⌘Jпредпросмотр
На этой странице

Ссылки на методы

Все темы Java Developer

Что такое «ссылка на метод»?

Ссылка на метод (Method reference) в Java представляет собой компактный способ передать ссылку на существующий метод вместо явного написания лямбда-выражения. Она используется для передачи метода как параметра в функции или для создания экземпляра функционального интерфейса.

Основные типы ссылок на методы:
  1. Ссылка на статический метод:

    • Пример: ClassName::staticMethodName.

    • Используется для вызова статического метода класса.

  2. Ссылка на метод экземпляра объекта:

    • Пример: objectInstance::instanceMethodName.

    • Используется для вызова метода конкретного объекта.

  3. Ссылка на метод экземпляра по ссылке класса:

    • Пример: ClassName::instanceMethodName.

    • Для ClassName::instanceMethodName получателем становится первый аргумент функционального интерфейса, остальные передаются методу. Например, String::toUpperCase соответствует s -> s.toUpperCase().


Какие виды ссылок на методы вы знаете?

В Java существует несколько видов ссылок на методы, которые позволяют передавать методы как параметры или использовать их в функциональных интерфейсах более компактным способом, чем лямбда-выражения.

Основные виды ссылок на методы:
  1. Ссылка на статический метод:

    • Это ссылка на статический метод класса.

    • Синтаксис: 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!");
          }
      }
  2. Ссылка на метод экземпляра объекта:

    • Это ссылка на метод экземпляра конкретного объекта.

    • Синтаксис: 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");
          }
      }
  3. Ссылка на метод экземпляра по ссылке класса:

    • Это несвязанная ссылка на метод экземпляра: объект-получатель передаётся первым аргументом при вызове функционального интерфейса.

    • Синтаксис: 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);
          }
      }
  4. Ссылка на конструктор:

    • Это ссылка на конструктор класса.

    • Синтаксис: 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());
          }
      }

Эта страница была полезной?