Функциональные интерфейсы в Java
Last updated: 4 мая 2025 г.В прошлом уроке мы видели интерфейс с одним единственным абстрактным методом.
Такой интерфейс называется функциональным.
Функциональный интерфейс
– представляет одну абстрактную функцию, которая существует для ее переопределения анонимными классами или лямбда выражениями (позже разберем что это).
Открывает функциональное программирование
. То есть функция используется как объект (ее можно хранить как объект, передать как объект аргументом в метод и т.д).
Пример программы:
1import java.util.*;
2
3interface Adder{
4 public double pow(double a, double b);
5}
6
7//Разъясним на примерах что такое
8//функциональное программирование.
9class FuncInt{
10 public static void main(String[] args) {
11 //В прошлом уроке мы не создавали ссылку
12 //на однoразовый объект анонимного класса
13 //в этом уроке создадим ее (adder).
14 Adder adder = new Adder() {
15 public double pow(double a, double b){
16 double result = a;
17 for(int i=1; i < b; i++){
18 result *= a;
19 }
20 return result;
21 }
22 };
23 //Теперь созданный объект
24 //не такой однoразовый как в прошлом уроке
25 //так как мы создали ссылку adder и можем работать
26 //с созданным объектом через нее.
27 //Например вызовем метод pow через эту ссылку.
28 System.out.println(adder.pow(3,6));
29 //И где же здесь функциональное программирование?
30 //Спросите вы. В начале было упомянуто что
31 //"функцию можно хранить как объект".
32 //Что это значит? Это значит что мы сохранили
33 //реализацию функции pow в объект, к которому мы
34 //можем получить доступ через ссылку adder.
35 //То есть мы фактически храним одну единственную
36 //функцию в одном объекте. и мы можем пользоваться
37 //этой функцией через этот объект. и эта
38 //единственность функции достигается как раз
39 //функциональным интерфейсом поскольку в нем может
40 //быть всего одна функция. Спросите чем же так важна
41 //эта единственность? На этот вопрос лучше всего
42 //ответить аналогией. Мы же не храним
43 //в переменной int два числа мы храним одно.
44 //То есть например int a=5,b=59,c=91.
45 //Каждая переменной хранится одно число и
46 //также мы храним одну функцию в одном объекте.
47 //В adder мы сохранили одну реализацию метода pow,
48 //также можем создать adder1, в котором мы сохраним
49 //другую реализацию метода pow.
50 //Например ниже
51 Adder adder1 = new Adder() {
52 //другая реализация метода pow
53 //с помощью библиотеки Math.
54 public double pow(double a, double b){
55 //возвращаем a возведенное в степень b
56 return Math.pow(a, b);
57 }
58 };
59 }
60}
Вывод:

Выше было упомянуто что функцию можно передать как обьект аргументом в метод.
Продемонстрируем это.
Пример программы:
1import java.util.*;
2
3interface Adder{
4 public double pow(double a, double b);
5}
6
7class FuncInt1{
8 // Создадим какую-нибудь функцию, в которой будет
9 // использоваться метод pow из функционального
10 // интерфейса Adder.
11 public static double func(Adder a){
12 return a.pow(2, 5) + 20;
13 }
14
15 public static void main(String[] args) {
16 Adder adder = new Adder() {
17 public double pow(double a, double b){
18 double result = a;
19 for(int i = 1; i < b; i++){
20 result *= a;
21 }
22 return result;
23 }
24 };
25
26 Adder adder1 = new Adder() {
27 public double pow(double a, double b){
28 return Math.pow(a, b);
29 }
30 };
31
32 // Очевидно, что мы можем передать функцию
33 // в объекте adder или adder1 в метод func,
34 // чтобы она там, в func, использовалась.
35
36 System.out.println(func(adder));
37 // или
38 System.out.println(func(adder1));
39
40 // То есть мы видим, что можем передать
41 // в метод именно функцию, как например
42 // числовую переменную или как сложный объект,
43 // но мы передаем именно одну функцию.
44
45 // И думаю, очевидно, почему программирование
46 // называется функциональным:
47 // Мы оперируем функциями.
48 }
49}
Вывод:

Следующие уроки
Лямбда выражения
13
мин.
Java Stream API
10
мин.
Работа с элементами файловой системы с помощью класса File
10
мин.