Бесплатный курс по Java: от основ до продвинутого уровня
Функциональные интерфейсы в Java
В прошлом уроке мы видели интерфейс с одним единственным абстрактным методом.
Такой интерфейс называется функциональным.
Функциональный интерфейс – представляет одну абстрактную функцию, которая существует для ее переопределения анонимными классами или лямбда выражениями (позже разберем что это).
Открывает функциональное программирование. То есть функция используется как объект (ее можно хранить как объект, передать как объект аргументом в метод и т.д).
Пример программы:
import java.util.*;
interface Adder{
public double pow(double a, double b);
}
//Разъясним на примерах что такое
//функциональное программирование.
class FuncInt{
public static void main(String[] args) {
//В прошлом уроке мы не создавали ссылку
//на однoразовый объект анонимного класса
//в этом уроке создадим ее (adder).
Adder adder = new Adder() {
public double pow(double a, double b){
double result = a;
for(int i=1; i < b; i++){
result *= a;
}
return result;
}
};
//Теперь созданный объект
//не такой однoразовый как в прошлом уроке
//так как мы создали ссылку adder и можем работать
//с созданным объектом через нее.
//Например вызовем метод pow через эту ссылку.
System.out.println(adder.pow(3,6));
//И где же здесь функциональное программирование?
//Спросите вы. В начале было упомянуто что
//"функцию можно хранить как объект".
//Что это значит? Это значит что мы сохранили
//реализацию функции pow в объект, к которому мы
//можем получить доступ через ссылку adder.
//То есть мы фактически храним одну единственную
//функцию в одном объекте. и мы можем пользоваться
//этой функцией через этот объект. и эта
//единственность функции достигается как раз
//функциональным интерфейсом поскольку в нем может
//быть всего одна функция. Спросите чем же так важна
//эта единственность? На этот вопрос лучше всего
//ответить аналогией. Мы же не храним
//в переменной int два числа мы храним одно.
//То есть например int a=5,b=59,c=91.
//Каждая переменной хранится одно число и
//также мы храним одну функцию в одном объекте.
//В adder мы сохранили одну реализацию метода pow,
//также можем создать adder1, в котором мы сохраним
//другую реализацию метода pow.
//Например ниже
Adder adder1 = new Adder() {
//другая реализация метода pow
//с помощью библиотеки Math.
public double pow(double a, double b){
//возвращаем a возведенное в степень b
return Math.pow(a, b);
}
};
}
}
Вывод:
Выше было упомянуто что функцию можно передать как обьект аргументом в метод.
Продемонстрируем это.
Пример программы:
import java.util.*;
interface Adder{
public double pow(double a, double b);
}
class FuncInt1{
// Создадим какую-нибудь функцию, в которой будет
// использоваться метод pow из функционального
// интерфейса Adder.
public static double func(Adder a){
return a.pow(2, 5) + 20;
}
public static void main(String[] args) {
Adder adder = new Adder() {
public double pow(double a, double b){
double result = a;
for(int i = 1; i < b; i++){
result *= a;
}
return result;
}
};
Adder adder1 = new Adder() {
public double pow(double a, double b){
return Math.pow(a, b);
}
};
// Очевидно, что мы можем передать функцию
// в объекте adder или adder1 в метод func,
// чтобы она там, в func, использовалась.
System.out.println(func(adder));
// или
System.out.println(func(adder1));
// То есть мы видим, что можем передать
// в метод именно функцию, как например
// числовую переменную или как сложный объект,
// но мы передаем именно одну функцию.
// И думаю, очевидно, почему программирование
// называется функциональным:
// Мы оперируем функциями.
}
}
Лямбда-выражения в Java: краткая реализация функциональных интерфейсов. Сравнение с анонимными классами и примеры использования с методами.
Time to read: 13
Java Stream API
Stream API в Java: обработка коллекций без ручной реализации. Фильтрация, сортировка, параллельные операции. Примеры использования map, filter, forEach.
Time to read: 10
Работа с элементами файловой системы с помощью класса File
Узнайте, как использовать класс File в Java для работы с файловой системой: получение пути, имени, проверка директорий и другие методы. Примеры кода.