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) {

    // Стандартний інтерфейс DemoSupplier<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

 


Зв’язані теми