Ранее я писал о функциональных интерфейсах и их использовании. Если вы исследуете 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 .