Топ-100Функциональные интерфейсы в Java
LogoCodOrbits

Раздел: Java Core

Раздел охватывает ключевые возможности языка Java: аннотации, исключения, generics, лямбда-выражения, интерфейсы и другие базовые концепции.

Все разделы
Иконка Java Core

Функциональные интерфейсы в 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
мин.

Similar Articles Icon
Divider

Java Stream API

10
мин.

Similar Articles Icon
Divider

Работа с элементами файловой системы с помощью класса File

10
мин.

Similar Articles Icon