Java. Стандартные (предопределенные) функциональные интерфейсы Java




Стандартные (предопределенные) функциональные интерфейсы Java


Содержание


Поиск на других ресурсах:

1. Общие сведения о стандартных интерфейсах Java. Список интерфейсов

Начиная с версии JDK 8, в языке Java определен ряд стандартных (предопределенных) функциональных интерфейсов. Эти интерфейсы широко используются в стандартных библиотеках языка Java, в частности, в средствах обработки потоков данных StreamAPI. Стандартные функциональные интерфейсы также можно использовать при разработке собственных программ.

Чтобы использовать стандартный интерфейс Java нужно подключить пакет java.util.function как показано ниже

import java.util.function.*;

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

  • UnaryOperator<T> – выполняет унарную операцию над объектом обобщенного типа T и возвращает результат типа T. Определяет метод apply();
  • BinaryOperator<T> — выполняет логическую операцию над двумя объектами типа T и возвращает результат того же типа. Определяет метод apply();
  • Consumer<T> — определяет метод accept(), который выполняет операцию над объектом типа T;
  • Supplier<T> — определяет метод get(), который возвращает объект типа T;
  • Function<T, R> — определяет метод apply(), который выполняет операцию над объектом типа T и возвращает результат типа R;
  • Predicate<T> — определяет метод test(). Метод получает параметром объект типа T и возвращает логическое значение. Метод test() определяет, удовлетворяет объект типа T некоторому логическому условию.

 

2. Функциональный интерфейс UnaryOperator<T>. Пример

В примере, с помощью функционального интерфейса UnaryOperator<T> определяется лямбда-выражение которое возвращает результат умножения входного параметра на 2.

// Предопределенные стандартные функциональные интерфейсы Java
// Подключить пакет java.util.function
import java.util.function.*;

public class FunctionalInterfaces {

  public static void main(String[] args) {
    // Функциональный интерфейс UnaryOperator<T>
    // Задача. Реализовать лямбда-выражение, удваивающее указанное число.
    // 1. Объявить ссылку на UnaryOperator<T> и присвоить ей лямбда-выражение
    UnaryOperator<Double> number = (n) -> n*2;

    // 2. Вызвать метод number.apply()
    Double t = number.apply(2.8);
    System.out.println("t = " + t); // t = 5.6
  }
}

 

3. Функциональный интерфейс BinaryOperator<T>. Пример

Функциональный интерфейс BinaryOperator<T> определяет метод apply(), который получает два параметра типа T и возвращает результат типа T. Метод выполняет некоторую операцию над параметрами. Сама операция реализуется в лямбда-выражении.

В примере демонстрируется интерфейс BinaryOperator<T>, который возводит первый параметр в степень, определенной вторым параметром.

// Предопределенные функциональные интерфейсы Java
// Подключить пакет java.util.function
import java.util.function.*;

public class FunctionalInterfaces {

  public static void main(String[] args) {
    // Функциональный интерфейс BinaryOperator<T>
    // Задача. Реализовать лямбда-выражение, возводящее число m в степень n.
    // 1. Объявить ссылку на BinaryOperator<T>
    BinaryOperator<Double> ref;

    // 2. Присвоить ссылке лямбда-выражение
    ref = (m, n) -> {
      return Math.pow(m, n); // вызвать функцию pow()
    };

    // 3. Вызвать метод number.apply() для параметров 3.0, 4.0
    Double t = ref.apply(3.0, 4.0);
    System.out.println("t = " + t); // t = 81.0
  }
}

 

4. Функциональный интерфейс Consumer<T>. Пример

Функциональный интерфейс Consumer<T> предназначен для выполнения некоторого действия над объектом типа T. Интерфейс содержит метод accept(), который получает объект типа T и возвращает результат типа void().

import java.util.function.*;

public class TrainConsumer {

  public static void main(String[] args) {
    // Функциональный интерфейс Consumer<T>

    // Задача. Реализовать действие, которое реверсирует целое число і
    // выводит результат на экран.
    // 1. Объявить ссылку на интерфейс Consumer<T> для типа Integer
    Consumer<Integer> cn;

    // 2. Реализовать лямбда-выражение
    cn = (n) -> {
      Integer t = n, number = 0;
      while (t>0) {
        number = number * 10 + t % 10;
        t = t/10;
      }
      System.out.println("number = " + number);
    };

    // 3. Вызвать метод accept()
    cn.accept(219);
  }
}

Результат выполнения программы

number = 912

 

5. Функциональный интерфейс Supplier<T>. Пример

Функциональный интерфейс Supplier<T> предназначен для получения объекта типа T. В интерфейсе определяется метод get(), который возвращает объект типа T.

// Предопределенные функциональные интерфейсы Java
// Подключить пакет java.util.function
import java.util.function.*;

public class FunctionalInterfaces {

  public static void main(String[] args) {

    // Стандартный интерфейс Supplier<T>
    // 1. Получить объект типа Integer
    // 1.1. Объявить ссылку типа Supplier<Integer>
    Supplier<Integer> ref;
    ref = () -> {
      return new Integer(23);
    };

    // 1.2. Вызвать метод get() интерфейса
    Integer objInt = ref.get();
    System.out.println("objInt = " + objInt);

    // 2. Получить объект типа Double[] - массив чисел
    // 2.1. Ссылка + лямбда-выражение, возвращающее массив из 5 случайных чисел
    Supplier<Double[]> refArray = () -> {
      Double[] AD = new Double[5];
      for (int i=0; i<AD.length; i++)
          AD[i] = Math.random()*100;
      return AD; // вернуть массив из 5 чисел
    };

    // 2.2. Вызвать метод get() интерфейса
    Double[] AD2 = refArray.get();

    // 2.3. Вывести массив AD2
    System.out.println("Array AD2.");
    for (Double x : AD2)
      System.out.print(x + " ");
    System.out.println();
  }
}

Результат выполнения

objInt = 23
Array AD2.
61.68462285137686 42.26246057548983 83.29368996444896 97.23604356051317 55.11066428763471

 

6. Функциональный интерфейс Function<T, R>. Пример

Функциональный интерфейс Function<T, R> содержит метод apply(). Этот метод получает один параметр (объект) типа T и возвращает результат (объект) типа R.
Ниже приведен пример использования данного функционального интерфейса.

// Предопределенные функциональные интерфейсы Java
// Подключить пакет java.util.function
import java.util.function.*;

public class FunctionalInterfaces {

  public static void main(String[] args) {
    // Функциональный интерфейс Function<T, R>
    // Задача 1. Реализовать вычисление корня из числа
    // 1.1. Объявить ссылку на функциональный интерфейс Function<T, R>
    Function<Integer, Double> ref1;

    // 1.2. Присвоить этой ссылке лямбда-выражение
    ref1 = n -> Math.sqrt(n);

    // 1.3. Продемонстрировать вычисление корня квадратного из 81
    Double result1 = ref1.apply(81);
    System.out.println("result1 = " + result1); // result1 = 9.0

    // ----------------------------------------------
    // Задача 2. Определить, есть ли число отрицательным
    // 2.1. Объявить ссылку на функциональный интерфейс Function<T, R>
    Function<Double, Boolean> ref2;

    // 2.2. Присвоить этой ссылке лямбда-выражение
    ref2 = (n) -> {
      if (n<0)
        return true;
      return false;
    };

    // 2.3. Продемонстрировать работу лямбда-выражения
    Boolean result2 = ref2.apply(-20.5);
    System.out.println("result2 = " + result2);
  }
}

Результат выполнения программы

result1 = 9.0
result2 = true

 

7. Функциональный интерфейс Predicate<T>. Пример

Функциональный интерфейс Pridicate<T> определяет метод test(), который получает значение типа T и возвращает результат типа boolean. В методе test() определяется проверка некоторого условия.

// Предопределенные функциональные интерфейсы Java
// Подключить пакет java.util.function
import java.util.function.*;

public class FunctionalInterfaces {

  public static void main(String[] args) {
    // Функциональный интерфейс Predicate<T>
    // 1. Ссылка на Predicate<Integer>
    Predicate<Integer> ref;

    // 2. Одиночное лямбда-выражение, определяющее есть ли value положительным
    ref = (value) -> value>0;
    System.out.println("-37 > 0 = " + ref.test(-37));

    // 3. Блочное лямбда-выражение, определяющее находится ли value в диапазоне [0..99]
    ref = (value) -> {
      if ((value>=0)&&(value<=99))
        return true;
      return false;
    };
    boolean result = ref.test(77);
    System.out.println("value in the range [0..99] = " + result);
  }
}

Результат выполнения программы

-37 > 0 = false
value in the range [0..99] = true

 


Связанные темы