Статьи

Функциональный интерфейс — функциональный интерфейс в пакете java.util.function в Java 8

Ранее я писал о функциональных интерфейсах и их использовании. Если вы исследуете API как часть Java 8, и особенно те API, которые поддерживают лямбда-выражения, вы найдете несколько интерфейсов, таких как: Function, Supplier, Consumer, Predicate и другие, которые являются частью пакета java.util.function. широко используется. Эти интерфейсы имеют один абстрактный метод, который переопределяется определенным лямбда-выражением. В этой статье я выберу интерфейс Function для краткого объяснения, и это один из интерфейсов, присутствующих в пакете java.util.function .

Интерфейс функции имеет два метода:

  • R apply (T t) — вычислить результат применения функции к входному аргументу.
  • default ‹V› Function ‹T, V› — Объединить с другой функцией, возвращающей функцию, которая выполняет обе функции.

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

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

Давайте посмотрим на API, который принимает реализацию интерфейса Function:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
public class FunctionDemo {
 
   //API which accepts an implementation of
   //Function interface
  static void modifyTheValue(int valueToBeOperated,
          Function<Integer, Integer> function){
 
    int newValue = function.apply(valueToBeOperated);
    /*
     * Do some operations using the new value.
     */
    System.out.println(newValue);
  }
}

Теперь давайте посмотрим на код, который вызывает этот API:

01
02
03
04
05
06
07
08
09
10
public static void main(String[] args) {
  int incr = 20;
  int myNumber = 10;
  modifyTheValue(myNumber, val-> val + incr);
 
  myNumber = 15;
  modifyTheValue(myNumber, val-> val * 10);
  modifyTheValue(myNumber, val-> val - 100);
  modifyTheValue(myNumber, val-> "somestring".length() + val - 100);
}

Вы можете видеть, что создаваемые лямбда-выражения принимают один параметр и возвращают некоторое значение.

Я скоро обновлю о различных API, которые используют этот интерфейс функции в качестве параметра. Между тем полный код:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class FunctionDemo {
 
  public static void main(String[] args) {
    int incr = 20;
    int myNumber = 10;
    modifyTheValue(myNumber, val-> val + incr);
 
    myNumber = 15;
    modifyTheValue(myNumber, val-> val * 10);
    modifyTheValue(myNumber, val-> val - 100);
    modifyTheValue(myNumber, val-> "somestring".length() + val - 100);
  }
 
  //API which accepts an implementation of
  //Function interface
  static void modifyTheValue(int valueToBeOperated,
          Function<Integer, Integer> function){
    int newValue = function.apply(valueToBeOperated);
    /*
     * Do some operations using the new value.
     */
    System.out.println(newValue);
  }
 
}

и вывод:

1
2
3
4
30
150
-85
-75

Примечание. Приведенный выше код был скомпилирован с использованием загруженного здесь JDK и ночных сборок Netbeans 8 .

Ссылка: Функциональный интерфейс — функциональный интерфейс в пакете java.util.function в Java 8 от нашего партнера по JCG Мохамеда Санауллы в блоге Experiences Unlimited .