Menu
Coddy logo textTech

Функциональные интерфейсы

Часть раздела Объектно-ориентированное программирование путешествия по Java на Coddy. Урок 39 из 87.

A functional interface — это interface, содержащий ровно один abstract method. Это ограничение на один method делает functional interface особенными, поскольку их можно реализовать с помощью lambda-выражений, что позволяет использовать более лаконичный стиль написания кода.

Java предоставляет аннотацию @FunctionalInterface, чтобы явно пометить интерфейс как функциональный. Хотя эта аннотация необязательна, она помогает компилятору обнаружить ошибки, если ты случайно добавишь второй абстрактный метод:

@FunctionalInterface
public interface Calculator {
    int calculate(int a, int b);
}

Вы можете реализовать functional interface традиционным способом с помощью class или более кратко с помощью lambda expression:

// Традиционная реализация
Calculator adder = new Calculator() {
    @Override
    public int calculate(int a, int b) {
        return a + b;
    }
};

// Lambda expression (much shorter!)
Calculator adder = (a, b) -> a + b;

System.out.println(adder.calculate(5, 3));  // 8

Functional interface могут по-прежнему иметь default method и static method, поскольку они не учитываются в правиле единственного abstract method. Пакет Java java.util.function предоставляет множество встроенных functional interface, таких как Predicate, Function и Consumer, с которыми ты часто будешь сталкиваться при работе с потоками и коллекциями.

challenge icon

Задание

Легко

Давайте создадим систему преобразования строк с использованием functional интерфейсов и lambda-выражений. Вы создадите гибкий обработчик текста, который может применять к строкам различные преобразования: всё это будет работать на основе одного functional интерфейса.

Вы организуете код в трёх файлах:

  • StringTransformer.java: Define functional интерфейс, представляющий любую operation преобразования строки. Пометьте его аннотацией @FunctionalInterface, чтобы гарантировать, что он остаётся functional. Ваш интерфейс должен Declare один abstract method с именем transform, который принимает String и возвращает String.
  • TextProcessor.java: Create class, использующий ваш functional интерфейс для обработки текста. В нём должно быть field для хранения StringTransformer и constructor для его инициализации. Включите method с именем process(String text), который применяет transformer к указанному тексту и возвращает Result. Такая конструкция позволяет передавать любое поведение преобразования через constructor.
  • Main.java: Объедините всё вместе, создавая различные преобразования с помощью lambda-выражений. Вы получите два input: строку текста и тип operation (upper, lower или reverse).

    Based на типе operation Create TextProcessor с соответствующей lambda:

    • upper: преобразует текст в верхний регистр
    • lower: преобразует текст в нижний регистр
    • reverse: разворачивает текст (hint: используйте StringBuilder)

    Затем вызовите process() с input-текстом и выведите Result в следующем format: Result: [transformed text]

Вы получите два input: текст для преобразования (String) и тип operation (String).

Обратите внимание, как один и тот же TextProcessor class может выполнять совершенно разные operation в зависимости от того, какую lambda вы ему передадите: в этом и заключается сила functional интерфейсов!

Попробуйте сами

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String text = scanner.nextLine();
        String operation = scanner.nextLine();
        
        TextProcessor processor;
        
        // TODO: На основе типа операции создайте TextProcessor с соответствующей лямбдой:
        // - "upper": преобразует текст в верхний регистр
        // - "lower": преобразует текст в нижний регистр
        // - "reverse": переворачивает текст (подсказка: используйте StringBuilder)
        
        // TODO: Вызовите process() с входным текстом и выведите результат
        // Формат вывода: "Result: [transformed text]"
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор Java