Автор оригинала: Pankaj Kumar.
Ссылка на метод Java была введена в Java 8 вместе с лямбда-выражениями. Ссылка на метод-это быстрый способ создания лямбда-выражений, когда он просто вызывает метод.
Что такое Ссылка на метод Java?
Ссылка на метод позволяет нам создать лямбда-выражение из существующего метода. Он используется, когда лямбда – выражение вызывает функцию и больше ничего не делает. JVM заботится о создании лямбда-выражения путем сопоставления входных переменных с аргументами метода.
Синтаксис Ссылки на метод
Ссылка на метод состоит из двух частей – класса/объекта и метода/конструктора. Они разделены двойными двоеточиями (::). Дополнительные параметры, передаваемые со ссылкой на метод, отсутствуют.
Типы ссылок на методы
В Java существует четыре типа ссылок на методы.
- Ссылка на статический метод: его синтаксис Класс::Имя статического метода
- Ссылка на метод экземпляра объекта: синтаксис: Объект::имя метода экземпляра
- Ссылка на метод экземпляра произвольного объекта определенного типа: синтаксис: Класс::имя метода экземпляра
- Ссылка на конструктор: его синтаксис Имя класса::новый
Ссылочные типы методов Java
Примеры ссылок на методы Java
Давайте рассмотрим примеры всех четырех типов ссылок на методы. Сначала мы создадим лямбда-выражение, а затем используем ссылку на метод, чтобы добиться того же эффекта.
1. Ссылка на Статический Метод
Допустим, у нас есть функциональный интерфейс, как показано ниже.
@FunctionalInterface interface Counter { int count(Object[] objArray); }
У нас есть класс Utils для получения количества элементов в массиве.
class Utils { public static int countElements(Object[] array) { return array.length; } }
Мы будем использовать лямбда-выражение для вызова метода Utils class count Elements (), чтобы получить количество элементов в массиве.
Integer[] intArray = { 1, 2, 3, 4, 5 }; // lambda expression Counter counter2 = array -> Utils.countElements(array); System.out.println(counter2.count(intArray)); // 5
Здесь лямбда-выражение просто вызывает статический метод класса Utils и больше ничего не делает. Это идеальное место для использования ссылки на метод для вызова статического метода.
Counter counter = Utils::countElements;
2. Ссылка на Метод Экземпляра объекта
Давайте изменим реализацию класса Utils и создадим метод экземпляра.
class Utils { public int count(Object[] array) { return array.length; } }
Теперь мы создадим лямбда-выражение, вызывающее этот метод экземпляра.
Utils ut = new Utils(); Counter counter1 = array -> ut.count(array);
Мы можем заменить лямбда-выражение ссылкой на метод экземпляра.
Counter counter1 = ut::count;
Мы можем создать экземпляр класса Utils в самой ссылке на метод.
Counter counter1 = new Utils()::count;
3. Ссылка на метод экземпляра произвольного объекта
Иногда мы вызываем метод аргумента в лямбда-выражении. В этом случае мы можем использовать ссылку на метод для вызова метода экземпляра произвольного объекта определенного типа.
Допустим, у нас есть такое лямбда-выражение.
String[] strArray = { "A", "E", "I", "O", "U", "a", "e", "i", "o", "u" }; Arrays.sort(strArray, (s1, s2) -> s1.compareToIgnoreCase(s2));
Здесь лямбда-выражение просто вызывает метод. Итак, мы можем использовать ссылку на метод здесь. Но метод вызывается для произвольного объекта String. Таким образом, мы можем вызвать метод экземпляра, обратившись к классу String.
Arrays.sort(strArray, String::compareToIgnoreCase);
4. Ссылка на метод Конструктора
Метод Stream collect() принимает аргумент поставщика. Поставщик должен каждый раз возвращать новый экземпляр. Таким образом, лямбда-выражение должно вызывать конструктор. Давайте рассмотрим простой пример.
ListintList = List.of(1, 2, 3, 4, 5); String concat1 = intList.parallelStream().collect( () -> new StringBuilder(), (x, y) -> x.append(y), (a, b) -> a.append(b)).toString();
Здесь мы можем заменить “() -> new StringBuilder()” ссылкой на метод конструктора.
String concat1 = intList.parallelStream().collect( StringBuilder::new, (x, y) -> x.append(y), (a, b) -> a.append(b)).toString();
Что ж, нам не нужно здесь останавливаться. Два других лямбда-выражения также могут быть заменены ссылкой на метод.
String concat1 = intList.parallelStream().collect( StringBuilder::new, StringBuilder::append, StringBuilder::append).toString();