Функциональные интерфейсы на Java

Функциональные интерфейсы — это новые дополнения в Java 8. Как правило, функциональный интерфейс может содержать ровно один абстрактный метод. Эти функциональные интерфейсы также называются интерфейсами с одним абстрактным методом (SAM Interfaces).

  1. Что такое Функциональный интерфейс?
  2. Аннотация @FunctionalInterface
  3. Функциональные интерфейсы в JDK
  4. Демонстрация
  5. Заключение

Что такое Функциональный интерфейс?

Разрешен только один абстрактный метод

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

  • Методы по умолчанию
  • Статические методы
  • Открытые методы, унаследованные от класса Object

Реализовано с помощью лямбда-выражений

В Java лямбда-выражения могут использоваться для представления экземпляра функционального интерфейса. Например, интерфейс компаратора — это функциональный интерфейс.

@FunctionalInterface
public interface Comparator<T> {
	int compare(T o1, T o2);
	boolean equals(Object obj);

	//and multiple default methods...
}

Интерфейс Comparator имеет только два абстрактных метода compare() и equals(). Но функция equals() была унаследована от класса Object, поэтому она не учитывается. Кроме этих двух методов, все остальные методы являются методами по умолчанию. Таким образом, Comparator имеет право быть объявленным как функциональный интерфейс.

Java-программа для реализации компаратора с использованием лямбда-выражения.

//Compare by Id
Comparator<Employee> compareById = Comparator.comparing(e -> e.getId());

Comparator<Employee> compareByFirstName = Comparator.comparing(e -> e.getFirstName());

Аннотация @FunctionalInterface

В Java 8 введена аннотация @FunctionalInterface для обозначения интерфейса как функционального интерфейса. Основное использование этой аннотации предназначено для ошибок на уровне компилятора, когда интерфейс нарушает контракты только одного абстрактного метода.

Обратите внимание, что использование аннотации @FunctionalInterface необязательно.

Если интерфейс имеет один абстрактный метод и не имеет аннотации @FunctionalInterface, интерфейс по-прежнему является функциональным интерфейсом, и он может быть целевым типом для лямбда-выражений.

Наличие аннотации защищает нас от непреднамеренного изменения функционального интерфейса в нефункциональный интерфейс, поскольку компилятор перехватит его.

Давайте создадим наш первый функциональный интерфейс. Обратите внимание, что методы в интерфейсе по умолчанию являются абстрактными.

@FunctionalInterface
public interface MyFirstFunctionalInterface 
{
    public void firstWork();
}

Давайте попробуем добавить еще один абстрактный метод:

@FunctionalInterface
public interface MyFirstFunctionalInterface 
{
    public void firstWork();
    public void doSomeMoreWork();   //error
}

Приведенный выше код приведет к ошибке компилятора:

Unexpected @FunctionalInterface annotation
@FunctionalInterface ^ MyFirstFunctionalInterface is not a functional interface
multiple non-overriding abstract methods found in interface MyFirstFunctionalInterface

Функциональные интерфейсы в JDK

Ниже приведен список наиболее часто используемых функциональных интерфейсов Java.

  • Runnable: содержит только метод run().
  • Comparable: содержит только метод compareTo().
  • ActionListener: содержит только метод actionPerformed().
  • Callable: содержит только метод call().
  • Predicate: функция с логическим значением, которая принимает аргумент и возвращает значение true или false.
  • BiPredicate: предикат с двумя аргументами.
  • Consumer: операция, которая принимает аргумент, работает с ним и не возвращает результата.
  • BiConsumer: потребитель с двумя аргументами.
  • Supplier: поставщик, который возвращает значение.
  • Function<T, R>: принимает аргумент типа T и возвращает результат типа R.
  • BiFunction<T, U, R>: принимает два аргумента типов T и U и возвращает результат типа R.

Демонстрация

Давайте рассмотрим краткий пример создания и использования функциональных интерфейсов в Java.

Мы используем функциональную интерфейсную функцию для создания формулы для математических квадратов.

Function<Integer, Integer> square = x -> x * x;

Интерфейс функции имеет один абстрактный метод apply(), который мы реализовали выше. мы можем выполнить описанный выше метод следующим образом:

System.out.println( square.apply(5) );  //Prints 25

Вывод

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

Мы также увидели, что JDK предоставляет существующие функциональные интерфейсы, и, наконец, как создать функциональный интерфейс.

Добавить комментарий

Ваш адрес email не будет опубликован.

8 + десять =