Рубрики
Без рубрики

Ссылочные типы и примеры методов Java

Ссылка на метод Java была введена в Java 8 вместе с лямбда-выражениями. Ссылка на метод-это быстрый способ создания лямбда-выражений, когда он

Автор оригинала: Pankaj Kumar.

Ссылка на метод Java была введена в Java 8 вместе с лямбда-выражениями. Ссылка на метод-это быстрый способ создания лямбда-выражений, когда он просто вызывает метод.

Что такое Ссылка на метод Java?

Ссылка на метод позволяет нам создать лямбда-выражение из существующего метода. Он используется, когда лямбда – выражение вызывает функцию и больше ничего не делает. JVM заботится о создании лямбда-выражения путем сопоставления входных переменных с аргументами метода.

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

Ссылка на метод состоит из двух частей – класса/объекта и метода/конструктора. Они разделены двойными двоеточиями (::). Дополнительные параметры, передаваемые со ссылкой на метод, отсутствуют.

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

В Java существует четыре типа ссылок на методы.

  1. Ссылка на статический метод: его синтаксис Класс::Имя статического метода
  2. Ссылка на метод экземпляра объекта: синтаксис: Объект::имя метода экземпляра
  3. Ссылка на метод экземпляра произвольного объекта определенного типа: синтаксис: Класс::имя метода экземпляра
  4. Ссылка на конструктор: его синтаксис Имя класса::новый

Ссылочные типы методов 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() принимает аргумент поставщика. Поставщик должен каждый раз возвращать новый экземпляр. Таким образом, лямбда-выражение должно вызывать конструктор. Давайте рассмотрим простой пример.

List intList = 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();

Ссылка